分治
思想同归并排序,对原list不断二分得到子列表,子列表长度为1或2时停止
对于长度为2的子列表中的两个链表合并(合并两升序链表),不断向上归并
时间复杂度O(nlogn)
class Solution:
"合并两个升序链表"
def mergeTwoLists(self,l1,l2):
dummy=ListNode()
p=dummy
while l1 and l2:
s1,s2=l1.val,l2.val
if s1<=s2:
p.next=l1
p=p.next
l1=l1.next
else:
p.next=l2
p=p.next
l2=l2.next
if l1 is None:
p.next=l2
if l2 is None:
p.next=l1
return dummy.next
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
##处理lists=[]的边界##
if lists==[]:return None
##divide停止条件##
if len(lists)==1:return lists[0]
##对长度为2的list中两个链表合并##
if len(lists)==2:
return self.mergeTwoLists(lists[0],lists[1])
##二分##
left,right=lists[:len(lists)//2],lists[len(lists)//2:]
##归并##
return self.mergeTwoLists(self.mergeKLists(left),self.mergeKLists(right))
逐一比较
依次比较每一个头节点,选出最小的放在新建链表后
设list中由k个链表,最终链表长为N
则要经过kN次遍历,时间复杂度O(N)
空间复杂度O(1)