【leetcode】合并K个升序链表

题目:23. 合并K个升序链表 - 力扣(LeetCode) (leetcode-cn.com)

思路:

合并k个链表和合并2个链表的逻辑类似,都是迭代以此比较两个链表上的元素,取出小的节点加入合并的链表。

但是合并k个链表难点在于如何获得k链表的最小值,此时引入一个优先级队列,其实是一个最小堆,就可以每次获得k个节点的最小值

优先级队列使用方法如下,可以搭配比较函数使用

数据结构之优先队列(最小堆)_追忆似水_年华的博客-CSDN博客_优先队列最小堆

算法

1.新建一个优先级队列pq,比较规则以节点的元素大小按从小到大的最小堆,保证每次取出来的值是最小值

2.创建合并链表的虚拟头节点

1
2
ListNode dumpy = new ListNode(-1);
ListNode p = dumpy;

3.先将不是空链表的头节点加入最小堆中

如果最小堆不为空:

4.从最小堆中拿出最小值加到合并的链表中node = pq.poll(),p.next = node;

   4.1 拿出后node,如果node.next不为null,说明所在的链表此时还有数据,应该将下一个节点node.next再加入到最小堆中,

   4.2 如果node所在的链表此时没有数据,说明这个链表的已经全部加入合并链表中,此时只需要比较其余节点

如果最小堆为空:

则说明所有数据都已经加入合并链表中了

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
         
        // 优先队列中是不允许传null,长度不能传0,因此需要单独判断
        if (lists.length == 0) return null;
        ListNode dumpy = new ListNode(-1);
        ListNode p = dumpy;
 
        // 最小堆:根据元素大小,从小到大
        PriorityQueue<ListNode> pq = new PriorityQueue<>(lists.length,(a,b) -> (a.val - b.val));
 
         
 
        for(ListNode head : lists){
            if(head!=null){
                pq.add(head);
            }
        }
 
        while(!pq.isEmpty()){
            // 拿出当前所有链表所有节点的最小值
            ListNode node = pq.poll();
            p.next = node;
            if(node.next != null){
                pq.add(node.next);
            }
            p = p .next;
        }
 
 
        return dumpy.next;
 
 
 
    }
}

  

 

posted @   MintMin  阅读(142)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示