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

相关推荐
CoderYanger6 小时前
Java EE 进阶:8.MyBatis 操作数据库(入门)(第二弹)
java·数据库·spring boot·spring·面试·java-ee·mybatis
CQU_JIAKE9 小时前
11.7[高体】
java·后端·spring
apcipot_rain10 小时前
C++转Java日记(04)
java·开发语言·c++
特立独行的猫A10 小时前
我给女儿写了个打字练习:一边敲键盘,一边把小学英语单词记牢
java·后端·python
憧憬成为java架构高手的小白12 小时前
LangGraph4j 实战(下)
java
天诰12 小时前
SA-K-11 检索会消失吗与四个未解问题
java·服务器·人工智能·python·机器学习·ai编程
这个昵称不容易16 小时前
SpringBoot「衣依」服装销售平台:144个Java文件180个接口,从挑衣服到收货评价整条链路都在
java·springboot·毕设
计算机毕设定制辅导-无忧学长16 小时前
《基于微信小程序的居家医疗陪护预约系统设计与实现》
java·spring boot·微信小程序·uniapp·居家医疗陪护预约系统
文丑颜不良啊17 小时前
LeetCode2221~2240题目解析
java·leetcode
秋饼18 小时前
Computer Use Agent Java 落地实战:感知-行动循环、执行器与安全围栏生产级实现
java·ai·技术分享·后端开发