有一说一,看完题目后我还没想好怎么做

我最初的想法是:对列表进行遍历,找出最小的结点加入新链表中,直到列表中不存在结点
但这样的话时间复杂度就不满足要求了

然后我瞥见知识点:堆
堆!堆……堆?
一个程序员有一个问题要解决,他准备用多线程来做,现在他有两个问题了
有一说一堆我基本上忘干净了😢

然后我又看见了分治
分治!……分治?
哦哦哦哦哦哦归并归并!!!

说真的,如果没想起归并排序我估计还得卡更久
代码如下:

def mergeKLists(self , lists: List[ListNode]) -> ListNode:
    lists_len = len(lists)
    if lists_len == 1:      # 如果列表里仅有一链表,则返回
        return lists[0]
    if lists_len >= 2:      # 如果有两个以上,则接着分
        left_list = self.mergeKLists(lists[0:lists_len // 2])
        right_list = self.mergeKLists(lists[lists_len // 2:])
        return self.Merge(left_list, right_list)    # 合并链表并返回
      
    return None


def Merge(self , pHead1: ListNode, pHead2: ListNode) -> ListNode:
    if pHead1 == None:
        return pHead2
    if pHead2 == None:
        return pHead1
    
    head = ListNode(0)
    cur = head
    while pHead1 != None and pHead2 != None:
        if pHead1.val <= pHead2.val:
            cur.next = pHead1
            pHead1 = pHead1.next
        else:
            cur.next = pHead2
            pHead2 = pHead2.next
        cur = cur.next
            
    if pHead1 == None:
        cur.next = pHead2
    else:
        cur.next = pHead1
    
    return head.next

为啥 Merge() 没注释嘞?
因为是从合并两个排序的链表cv过来的