每天两道LeetCodeHard:(2)

187 阅读1分钟

23. Merge k Sorted Lists

本次是lc 23,要求融合k个排序连链表

题干:

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

解释:

非常直白的一个表述,把链表合并即可。

思考:

因为是有序的,所以其实也非常直观,合并链表的办法无非就是merge sort的套路,问题在于现在有多个链表头,如果每次都把所有的链表头都比对一下,上次比对之后的结果就浪费了,那么如何才能用上之前比对的结果呢?换个表述,我们实际上是要找链表头中的最小值,那么如何快速找到最小值呢?

答案:

用最小堆。每次找到最小的头节点,出堆,然后把最小头节点的下一个节点进堆,直到堆中为空。时间复杂度为NlogK,插入输出都为O1,但是rebuild为logK 示例代码:

class Solution:
    def mergeKLists(self, lists):
        """
        :type lists: List[ListNode]
        :rtype: ListNode
        """
        minHeap =[]
        heapq.heapify(minHeap)
        for head in lists:
            if head!=None:
                heapq.heappush(minHeap, [head.val,head])
        pre = ListNode(0)
        res=pre
        while minHeap:
            pre.next = heapq.heappop(minHeap)[1]
            if pre.next.next!=None:
                heapq.heappush(minHeap,[pre.next.next.val,pre.next.next])
            pre= pre.next
        return res.next

答案补充:

也可以链表两两合并,同样避免了重复比较,复杂度NlogK