LeetCode:23合并K个升序链表

java 复制代码
/**
 * 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) {
        if(lists == null || lists.length == 0){
            return null;
        }
        //设置优先队列
        PriorityQueue<ListNode> pq = new PriorityQueue<>(
            lists.length,
            (a,b) -> a.val - b.val
        );

        ListNode dummy = new ListNode(0);
        ListNode curr = dummy;
        //放入每个数组的第一个元素
        for(ListNode head : lists){
            if(head != null){
                pq.offer(head);
            }
        }
        //排序
        while(!pq.isEmpty()){
            ListNode minNode = pq.poll();
            curr.next = minNode;
            curr = curr.next;

            if(minNode.next != null){
                pq.offer(minNode.next);
            }
        }
        return dummy.next;
    }
}

单步解析:

java 复制代码
 PriorityQueue<ListNode> pq = new PriorityQueue<>(

      lists.length,

      (a,b) -> a.val - b.val

);

设置优先队列PriorityQueue,底层是二叉堆,可以保证每次取出的元素是最大或者最小的;第一个参数lists.length为设置初始容量,不写默认是11,如果装不下系统会自动扩容,但是扩容会及其消耗性能。 (a,b) -> a.val - b.val为Lambda表达式,返回值a.val - b.val为负数系统认为a比b小,为小根堆;a比b大为大根堆;相等则一样大。

java 复制代码
  for(ListNode head : lists){

    if(head != null){

        pq.offer(head);

    }

}

这部分代码在将lists元素存入pq中时只将每个数组的第一个元素存入到了pq中去,这样做既节约内存,也节省时间。

java 复制代码
if(minNode.next != null){

    pq.offer(minNode.next);

}

这里加入以第一个为例,在存入进1后,因为还有后续元素,会将4再存入到队列中去,原队列就从原来的1,1,2变成了1,2,4。

相关推荐
Javatutouhouduan4 分钟前
阿里1658页Java面试题总结(含答案)
java·高并发·java面试·java面试题·后端开发·java程序员·java八股文
秋天的怀念_David21 分钟前
算法一千零一夜 · 第十三夜 幻方,武侠世界里的数学迷宫
java·程序人生·算法
lll235269177934 分钟前
HR如何快速整理面试沟通内容?
面试·职场和发展
专业程序开发源41 分钟前
springboot欧缇蔓月子中心管理系统82697-计算机课程设计、毕业设计
java·spring boot·后端·python·spring·django·课程设计
零售校长1 小时前
西湖区零售门店店长面试怎么准备
面试·职场和发展·零售
秋天的怀念_David1 小时前
算法一千零一夜 · 第十四夜 幻方与奇妙的二进制
java·程序人生·算法
thefool1122661 小时前
网络编程^
java
薛定e的猫咪1 小时前
(ICLR 2020)MAML 靠的不是快速学习,而是特征复用
人工智能·深度学习·学习·算法·机器学习
薛定e的猫咪1 小时前
(ICLR 2026)DF-META:面向 FJSP 的无导数元学习实例自适应调度
人工智能·深度学习·学习·算法·机器学习
Thinker QAQ2 小时前
并发编程(十一):Shared Memory 与 Message Passing——关系与组合使用
java·python·go·并发编程·shared memory·message passing