【极速推题】队列相关之二

发布于 2023-08-05  671 次阅读


题目描述

23. 合并 K 个升序链表 - 力扣(LeetCode)

给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。

解题思路

这题的简洁版就是合并2个升序链表,问题的难点就出在对k个结点的比较上,怎么最快比较?要用堆,由此想到用PriorityQueue

  • priorityqueue.put((堆内比较的值,附带的其他信息))是向PriorityQueue内放新结点,注意这里有两层括号!
  • priorityqueue.get()则会弹出当前堆内值最小的结点,注意这一步结束后该结点就已经弹出了
  • priorityqueue.queue可以输出当前堆内所有的结点,是不弹出的,且需注意put、get都是方法,queue居然是属性,怎么设计的这么坑
  • priorityqueue遇到相同priority的情况会直接报错,可以put((堆内比较的值,count,附带的其他信息)),因为附加的其他信息未必是comparable的,所以我维护一个自增int的count可以保证始终是互相区分且comparable的

最后关于边界处理,首先注意题目已确定输入链表数组的格式为List[Optional[ListNode]],其中Optional[ListNode]的含义就是要么ListNode要么None,所以它其实在提醒我——输入边界[[]](同时也是输入示例2)的判断应该为if len(lists) == 1 and lists[0] is None,而非if len(lists) == 1 and len(lists[0]) == 0,虽然从常理上后者用来判断该边界很正常,但用力扣编译器work时该处运行出错了,仔细回顾后我发现一方面输入的格式在提醒我,另一方面这个错误其实源自ListNode自身的表示,输入边界[[]]中外围的[]代表普通的List而内圈的[]代表ListNode,ListNode就一个结点本身就不需要len也没有实现len(可用dir确认),ListNode作为力扣自定义的重写List的类是需要被我试验哪些与List同、哪些与List不同的。

这种带指针的边界处理还需要注意头指针,参考以下笔记


暂时还没找到人生乐趣的消极家