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。

相关推荐
地平线开发者4 小时前
J6B vio scenario sample
算法
Flittly11 小时前
【AgentScope Java新手村系列】(16)从RAG到多路检索
java·spring boot·spring
小兔崽子去哪了11 小时前
Java 生成二维码解决方案
java·后端
BothSavage16 小时前
Trae远程开发中DeepSeek自定义模型4054错误的排查与修复
算法
小林ixn16 小时前
从暴力到KMP:一道题彻底搞懂字符串匹配的前世今生
算法
人活一口气16 小时前
从JVM调优到MCP协议:Java全栈技术体系深度总结与企业级架构实践
java·spring boot
烬羽17 小时前
字符串算法入门:从反转字符串到回文判断,面试不再慌
算法·面试
NE_STOP18 小时前
Vibe Coding -- 完整项目案例实操
java
荣码18 小时前
GraphRAG:普通RAG只能回答"点"的问题,我踩了4个坑才搞懂
java·python