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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值