《算法通关村——解析堆在合并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 = [[]]
输出:[]

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

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> 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;
    }
}

画图理解:



相关推荐
aigcapi4 小时前
RAG 系统的黑盒测试:从算法对齐视角解析 GEO 优化的技术指标体系
大数据·人工智能·算法
苏宸啊5 小时前
链式二叉树基操代码实现&OJ题目
数据结构
风筝在晴天搁浅5 小时前
hot100 25.K个一组翻转链表
数据结构·链表
柯慕灵5 小时前
7大推荐系统/算法框架对比
算法·推荐算法
adam-liu5 小时前
Fun Audio Chat 论文+项目调研
算法·语音端到端·fun-audio-chat
小十一再加一5 小时前
【初阶数据结构】栈和队列
数据结构
栀秋6665 小时前
你会先找行还是直接拍平?两种二分策略你Pick哪个?
前端·javascript·算法
如果你想拥有什么先让自己配得上拥有6 小时前
数学思想和数学思维分别都有什么?
线性代数·算法·机器学习
长安er6 小时前
LeetCode136/169/75/31/287 算法技巧题核心笔记
数据结构·算法·leetcode·链表·双指针
MarkHD6 小时前
智能体在车联网中的应用:第29天 多智能体完全合作场景的核心算法:从CTDE思想到VDN与MADDPG的深度解析
算法