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。

相关推荐
愿有所息10 小时前
记一次 ARM64 + JDK8 上 fastjson2 的诡异数据错乱
java
秋饼10 小时前
MCP 2026-07-28 无状态协议大改版:Spring AI 2.1 多轮往返请求与网关路由落地
java·ai·技术分享·后端开发
SL_staff11 小时前
JVS-BI 实战:业务人员如何用零代码 ELT + 可视化配置构建实时经营分析闭环
java·spring·全栈
SL_staff12 小时前
企业AI落地难?JVS-AI渐进式实践:安全可控、小切口验证、标准化沉淀与规模化复制
java·开源·aigc
武子康12 小时前
驾驶轨迹换个坐标,就能给移动机器人用吗?
人工智能·算法·机器学习
David猪大卫12 小时前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
SL_staff13 小时前
JVS数字底座实践:构建企业级统一内容管理平台的技术路径
java·产品
nice_lcj52013 小时前
【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端
java·后端·spring·spring ai·ai应用开发
vvilkim14 小时前
数据结构类型、区别与应用场景:一篇讲透选型逻辑
数据结构
桦说编程14 小时前
TransmittableThreadLocal 解读:从 CRR 机制到上下文所有权
java·后端·源码