leetcode hot100【LeetCode 23. 合并K个升序链表】java实现

LeetCode 23. 合并K个升序链表

题目描述

合并 k 个升序链表,返回合并后的链表。链表的节点数值按升序排列。

示例:

复制代码
输入:lists = [[1,4,5], [1,3,4], [2,6]]
输出:[1,1,2,3,4,4,5,6]

提示:

  • k == lists.length
  • 0 <= k <= 10^4
  • 0 <= lists[i].length <= 500
  • -10^4 <= lists[i][j] <= 10^4

Java 实现解法

方法一:优先队列(最小堆)
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> minHeap = new PriorityQueue<>((a, b) -> a.val - b.val);
        for (ListNode node : lists) {
            if (node != null) {
                minHeap.add(node);
            }
        }
        ListNode dummy = new ListNode(0);
        ListNode curr = dummy;
        while (!minHeap.isEmpty()) {
            ListNode minNode = minHeap.poll();
            curr.next = minNode;
            curr = curr.next;
            if(minNode.next != null){
                minHeap.add(minNode.next);
            }
        }
        return dummy.next;
    }
}

解题思路

  • 优先队列(最小堆) :使用一个最小堆来存储所有链表的头节点,按照节点的值来排序。
    • 初始化最小堆,将所有链表的头节点加入堆中。
    • 每次从堆中取出最小的节点,将其添加到结果链表中,然后将该节点的下一个节点加入堆中。
    • 重复这个过程,直到所有节点都被取出并合并。

这种方法的时间复杂度是 O(N log k),其中 N 是所有链表中节点的总数,k 是链表的数量。空间复杂度是 O(k),因为我们需要存储所有链表的头节点在堆中。这种方法利用了优先队列来高效地找到最小的节点并合并,是解决多个有序链表合并问题的高效方法。

相关推荐
小宇宙清歡渡6 小时前
Java Stream 流全面实战指南(Spring Boot 3 + JDK 17)
java·springboot·stream流
不爱吃米饭_7 小时前
Apache PDFBox Java PDF处理库
java
mldong7 小时前
流程图上没画人,单子却走对了:工作流引擎内置处理人解析器
java·架构
tanzongbiao7 小时前
Dorado7文件上传 解决HttpServletResponse返回值中文乱码的问题
java·服务器·前端
茶本无香9 小时前
Arthas 实战:线上“看 Map”的四种武器
java·map·arthas·线上定位
霸道流氓气质10 小时前
Spring AI异常处理与重试机制
java·人工智能·spring
郑州光合科技余经理11 小时前
本地生活服务系统:成品模块和定制接口怎么划界
java·前端·人工智能·后端·系统架构·php·ai编程
萧瑟余晖12 小时前
Java深入解析篇三十三之密封类与接口(Sealed Classes)详解
java·开发语言
论迹复利15 小时前
FreeRTOS 在 RISC-V 上是如何“点火“的 —— 从 main() 到第一个任务的完整链路
java·开发语言·risc-v
张宇Joaquin16 小时前
鲲鹏统一并行加速库KUPL--众核并行能力介绍
java·开发语言·网络