当前位置: 首页 > article >正文

《算法通关村——解析堆在合并K个排序链表的应用》

《算法通关村——解析堆在合并K个排序链表的应用》

23. 合并 K 个升序链表

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例 1:

输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
  1->4->5,
  1->3->4,
  2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6

示例 2:

输入:lists = []
输出:[]

示例 3:

输入:lists = [[]]
输出:[]

这里直接给代码,我们来理解

/**
 * 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> q = new PriorityQueue<>(Comparator.comparing(node -> node.val));
        /*
        理解下面这个循环,只是把每个链表的第一个数放入最小堆中。
        */
        for(int i = 0;i< lists.length;i++){
            if(lists[i] != null){
                q.add(lists[i]);
            }
        }
        /*
        理解下面这个循环,首先就是把上面的每个链表的第一个元素进行了一个排序,然后把那个最小的元素的链表拿出来,把它放入我们定义的新的链表的下一个节点,判断他是否有下一个节点,如果有下一个节点,那么就把他放入最小堆里面去(此时堆会重新排序),然后再进行下一次循环,从最小堆中取元素。其实理解这里最重要就是要知道链表初始就是排好序的。
        */

        ListNode dummy = new ListNode(0);
        ListNode tail = dummy;
        while(!q.isEmpty()){
            tail.next = q.poll();
            tail = tail.next;
            if(tail.next != null){
                q.add(tail.next);
            }
        }
        return dummy.next;
    }
}

画图理解:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://www.kler.cn/a/146338.html

相关文章:

  • 浅谈云计算14 | 云存储技术
  • 如何通过高防服务隐藏服务器源IP
  • 【数据库初阶】MySQL中表的约束(上)
  • C++(二十一)
  • Lianwei 安全周报|2025.1.13
  • lwip单网卡多ip的实现
  • Git 分支设计规范
  • 计算机毕业设计|基于SpringBoot+MyBatis框架的电脑商城的设计与实现(商品和购物车)
  • ruoyi-plus-vue docker 部署
  • 《微信小程序开发从入门到实战》学习二十八
  • Clion取消double shift(按两下shift键)全局搜索
  • 简易版王者荣耀
  • Ansible的重用(include和import)
  • 大量索引场景下 Easysearch 和 Elasticsearch 的吞吐量差异
  • 某高级度假村技术人员薪酬体系设计咨询项目纪实
  • 基于Java SSM在线图书推荐与交流平台
  • requests请求django接口跨域问题处理
  • TypeError: ‘_io.TextIOWrapper’ object is not subscriptable
  • React整理总结(七、Hooks)
  • 关于C语言控制浮点数输出精度问题
  • 好用的png图片打包plist工具,推荐使用pngPackerGUI_V2.0
  • java设计模式学习之【抽象工厂模式】
  • i社为什么不出游戏了?
  • ISO27000认证实施意义
  • 计算机网络入门
  • 工信部:1—10月我国软件业务收入98191亿元 同比增长13.7%