更多题解尽在 https://sugar.matrixlab.dev/algorithm 每日更新。
组队打卡,更多解法等你一起来参与哦!
LeetCode 23. 合并 K 个升序链表,难度困难。
优先队列(小顶堆)
解题思路:拿到题首先想到以下几个方法
- 暴力:将所有数据存入数组中再排序,最后转成链表;时间复杂度
O(NlogN)
(N
表示所有链表的节点总数),空间复杂度O(N)
。 - 两两合并:两两合并链表,最终将所有链表合并为一个;每次合并的时间复杂度是
O(N)
,总的时间复杂度是O(KN)
。 - 优先队列(小顶堆):使用小顶堆,每次将堆顶元素(当前最小节点)取出并放入结果链表中,然后将该节点的下一个节点放入堆中;时间复杂度
O(NlogK)
,其中N
是所有链表节点的总数,空间复杂度O(K)
。
优先队列实现思路:创建优先队列(小顶堆)来处理 K
个链表的合并。每次获取当前所有链表中最小的节点。
- 我们需要使用优先队列存储每个链表的头节点。
- 每次从优先队列中取出最小的节点,将其加入到结果链表中。
- 如果取出的节点有下一个节点,则将下一个节点放入优先队列。
class Solution {public ListNode mergeKLists(ListNode[] lists) {// 定义小顶堆PriorityQueue<ListNode> pq = new PriorityQueue<>(new Comparator<ListNode>() {@Overridepublic int compare(ListNode o1, ListNode o2) {return o1.val - o2.val;}});// 将 list 的表头都放进优先队列for (ListNode head : lists) {if (head != null) {pq.offer(head);}}ListNode result = new ListNode();ListNode temp = result;// 优先队列不为空的情况下while (!pq.isEmpty()) {// 从 pq 里面取出最小的节点 node 放入 temp 节点后面ListNode node = pq.poll();temp.next = node;temp = temp.next;// 将 node 节点的后续节点加入到 pq 里面if (node.next != null) {pq.offer(node.next);}}return result.next;}
}作者:没事我就挠挠头
链接:https://leetcode.cn/problems/merge-k-sorted-lists/solutions/2816505/yi-wen-jiao-ni-zhang-wo-gai-ti-you-xian-pu2ca/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。