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。

相关推荐
测试学习test1 分钟前
SPI读取W25Q64硬件驱动(HAL库)
数据库·stm32·嵌入式硬件·算法
迅猛龙办公室8 分钟前
Python实现斐波那契数列
算法
淡海水9 分钟前
02-01-原理篇-Mark-Sweep与变种算法
算法·unity·c#·游戏引擎·.net·gc
Navigator_Z12 分钟前
LeetCode //C - 1276. Number of Burgers with No Waste of Ingredients
c语言·算法·leetcode
小狼1545419 分钟前
拼多多订单数据导出 CSV 实战:接口分页、字段平铺与 5 个数据坑,多多开票助手
java·前端·javascript
Joe_Wang522 分钟前
【从0到1学习JVM · 25】同样都要停顿所有线程,Parallel比Serial到底强在哪
java·jvm·学习·垃圾回收
wuminyu23 分钟前
JVM虚拟线程的底层实现原理分析
java·linux·c语言·jvm·c++
keyipatience24 分钟前
跳表详细解析
开发语言·数据结构·c++·算法·跳表
想吃火锅100542 分钟前
【leetcode】189.轮转数组js
开发语言·javascript·leetcode
小小、码农1 小时前
〖Linux文件系统〗:彻底打通文件 IO 全链路
linux·开发语言·数据结构·c++·系统