LeetCode第23题_合并K个升序链表

LeetCode 第23题:合并K个升序链表

题目描述

给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。

难度

困难

题目链接

https://leetcode.cn/problems/merge-k-sorted-lists/

示例

示例 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 = [[]]
输出:[]

提示

  • k == lists.length
  • 0 <= k <= 10^4
  • 0 <= lists[i].length <= 500
  • -10^4 <= lists[i][j] <= 10^4
  • lists[i] 按升序排列
  • lists[i].length 的总和不超过 10^4

解题思路

方法一:分治合并

将K个链表的合并问题分解为两两合并的子问题。

关键点:

  1. 使用分治思想,将K个链表分成两部分
  2. 递归地合并每部分的链表
  3. 最后将两个合并后的链表合并
  4. 复用第21题的两个链表合并方法

具体步骤:

  1. 如果链表数组为空,返回null
  2. 如果只有一个链表,直接返回
  3. 将链表数组分成两半
  4. 递归合并左半部分和右半部分
  5. 合并得到的两个链表

时间复杂度:O(N * log k),其中k是链表数量,N是所有节点的总数
空间复杂度:O(log k),递归栈的深度

方法二:优先队列

使用优先队列(最小堆)来维护k个链表的当前最小节点。

思路:

  1. 创建最小堆,将k个链表的头节点加入堆中
  2. 每次从堆中取出最小节点,加入结果链表
  3. 如果被取出的节点有后继节点,将后继节点加入堆中
  4. 重复步骤2-3直到堆为空

代码实现

C# 实现(分治合并)

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     public int val;
 *     public ListNode next;
 *     public ListNode(int val=0, ListNode next=null) {
 *         this.val = val;
 *         this.next = next;
 *     }
 * }
 */
public class Solution {
   
    public ListNode MergeKLists(ListNode[] lists) {
   
        if (lists == null || lists.Length == 0) return null;
        return 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值