合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
分析
与21题类似,由两个变成k个,
一
可以按照21题思路完成同时遍历k个链表,每次将最小的添加的新链表中,设每个链表有k个元素,此算法时间复杂度为 k * k * n(每选一个元素都需对比k个,共有k * n个元素)
二
利用二分法,将该问题分为2个子问题 一直递归下去,时间复杂度 k *n * log k
(k/(2^1) * 4 * (2^0) * n +k/(2^2) *4 (2^1) * n+…+k/(2^log k ) * 4 * (2^logk)n)
三
每次合并两个链表,时间复杂度同上
四
统计所有数,排序之后生成一个新的链表 时间复杂度 knlog(kn)
第21题见此https://blog.csdn.net/qq_37369124/article/details/87516339
此处用第三种方法
def mergeKLists(self, lists):
if(lists==[]):return []
while(len(lists)!=1):
l=[]
a=0
while(a+1<len(lists)):
t=self.mergeTwoLists(lists[a],lists[a+1])
l.append(t)
a=a+2
if len(lists)%2==1:l.append(lists[-1])
lists=l
return lists[0]
def mergeTwoLists(self, l1, l2):
N=ListNode(0)
M=N
while(l1!=None and l2!=None):
if(l1.val<l2.val):
N.next=l1
l1=l1.next
else:
N.next=l2
l2=l2.next
N=N.next
if l1!=None:N.next=l1
else:N.next=l2
return M.next