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