leetcode 23. Merge k Sorted Lists的思路与python实现 (Priority Queue)

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

Example:

Input:
[
  1->4->5,
  1->3->4,
  2->6
]
Output: 1->1->2->3->4->4->5->6

思路

用priority queue。

python的priority queue有两个,一般用heapq就行。另一个Queue.PriorityQueue一般用于多线程的同步任务。

heapq.heapify(list) 把list转为heap。

然后后面加入就用heapq.heappush(list, 值)

删除就用heapq.heappop(list)

这里我们要把node放进去,但是实际想按照node.val排序。heapq没有key参数,只能用把(node.val, node)放进heapq的方式来调整我们的优先级。但是这样一来,如果node.val相同,就会比较node,由于node之间无法比较就会报错。为了打破平衡,就再中间加入一个平衡打破者(只要等打破平衡,不让他往后去比较node就行),这里就使用list的index,(node.val, i, node)。

代码

class Solution:
    def mergeKLists(self, lists: List[ListNode]) -> ListNode:
        pairs = [(node.val, i, node) for i, node in enumerate(lists) if node]
        heapq.heapify(pairs)
        dummy = ListNode(0)
        cur = dummy
        while len(pairs) != 0:
            value, i, node = heapq.heappop(pairs)
            cur.next = node
            cur = cur.next
            if node.next:
                heapq.heappush(pairs, (node.next.val, i, node.next))
        return dummy.next

 

你可能感兴趣的:(leetcode)