合并K个排序链表
- 2019 年 10 月 5 日
- 笔记
合并K个排序链表
0.说在前面1.合并K个排序链表2.作者的话
0.说在前面
每周两篇leetcode刷题,今天本周第二篇,一起来看合并K个排序链表,下面一起来实战吧!
1.合并K个排序链表
问题
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6
算法一
【思想】
遍历k个链表,将每个链表中的节点值添加到list当中,然后排序,创建新链表!
【实现】
def mergeKLists(self, lists): all_list=[] for each in lists: while each: all_list.append(each.val) each=each.next all_list.sort() head=ListNode(0) p=head for i in all_list: p.next=ListNode(i) p=p.next p.next=None p=head.next del head return p
【分析】
假设其中最长链表长度为n,则时间复杂度为O(nk),空间复杂度为O(n)。
算法二
【思想】
两两链表合并,合并的时候采用递归进行合并,直到最后合并成一个链表,返回即可!
【实现】
class Solution: def mergeKLists(self, lists): """ :type lists: List[ListNode] :rtype: ListNode """ interval = 1 lists_len = len(lists) while interval<lists_len: for i in range(0,lists_len-interval,interval * 2): lists[i] = self.merge(lists[i], lists[i + interval]); interval *= 2 return lists[0] if len(lists) > 0 else None def merge(self,l1, l2): if l1 is None: return l2 if l2 is None: return l1 if l1.val < l2.val: l1.next = self.merge(l1.next, l2) return l1 else: l2.next = self.merge(l1, l2.next) return l2
【分析】
假设其中最长链表长度为n,两两合并时间复杂度O(n),每个链表遍历一次O(k)则,时间复杂度为O(nk),空间复杂度为O(1)。