23.合并k个升序链表(hard)

101 阅读1分钟

在这里插入图片描述

分治

思想同归并排序,对原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)