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),因为我们需要存储所有链表的头节点在堆中。这种方法利用了优先队列来高效地找到最小的节点并合并,是解决多个有序链表合并问题的高效方法。

相关推荐
什巳22 分钟前
JAVA练习306- 翻转二叉树
java·数据结构·算法·leetcode
smj2302_7968265229 分钟前
解决leetcode第3989题网格中保持一致的最大列数
python·算法·leetcode
wangbing11251 小时前
JPA下自定义主键
java·linux·服务器
plainGeekDev2 小时前
NullPointerException → Kotlin 空安全
android·java·kotlin
想做小南娘,发现自己是女生喵3 小时前
第 2 章 顺序表和 vector
java·数据结构·算法
CHANG_THE_WORLD4 小时前
6.多线程的TCP通信
java·网络·tcp/ip
sun03225 小时前
【笔记】Spring MVC 相关介绍
java·spring·mvc
兰令水5 小时前
hot100【acm版】【2026.7.18打卡-java版本】
java·开发语言·算法
CoderYanger5 小时前
A.每日一题:3020. 子集中元素的最大数量
java·程序人生·算法·leetcode·面试·职场和发展·学习方法
wear工程师6 小时前
CompletableFuture 的 allOf 到底怎么收结果?面试别只说并行
java·后端