算法导论记录丨23. 合并 K 个升序链表

作者阅读算法导论时遇到合并K个升序链表的问题,通过heapq实现优先队列解决。遇到挑战包括处理相等元素的排序和初始化非空判断。最终轻松AC,强调了理论学习的重要性。
摘要由CSDN通过智能技术生成

过年闲不下来(太菜了多练练),看算法导论书,做一点题目。

23. 合并 K 个升序链表/习题6.5-9

先贴代码,再总结下遇到的问题。

import heapq
class Solution:
    def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
        counter = itertools.count()  # 创建一个无限的递增计数器
        cur_heap = []
        dummy_head = ListNode()
        cur = dummy_head
        for item in lists:
            if item: heapq.heappush(cur_heap, (item.val,next(counter), item))
        while cur_heap:
            cur.next = heapq.heappop(cur_heap)[2]
            cur = cur.next
            if cur.next:
                heapq.heappush(cur_heap, (cur.next.val,next(counter), cur.next))
        return dummy_head.next

读算法导论书,习题6.5-9正好有一题力扣上也有的题目,做一下。

这章节是优先队列,那这题肯定是优先队列做。遇到的第一个问题是item.val相等时,heapq会去比较元组第二个元素,当时没有引入counter,他就会去比较item本身,listnode在设计时没有比大小功能,学到写法:

import itertools

counter = itertools.count()

只要调用next(counter)就会一直递增的返回从0开始的数字,解决了heapq不会处理相等的情况。

*当元素具有相同的优先级或值时,heapq 会尝试比较堆中的下一个元素(如果元素是元组或其他可比较的复合结构)。如果整个比较过程中所有可比较的部分都相等,那么 heapq 在没有其他比较依据的情况下,将无法决定两个元素的顺序,可能会引发 TypeError

第二个问题是for循环创建k个head的时候,必须先确定不是None对象才行。

这么容易就AC一个困难???还得是看书才行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值