合并K个升序链表(最优解)

题目来源

23. 合并 K 个升序链表 - 力扣(LeetCode)


题目描述

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例 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

题目限制

用最优解做出来


思路分析

在解决给定多个按升序排列的链表,将它们合并为一个升序链表的问题时,一种常见思路是采用顺序合并。先实现一个能合并两个有序链表的函数,通过比较节点值大小依次连接节点来合并。在合并多个链表的主函数里,先处理边界情况,如链表数组为空或元素全为空链表时直接返回相应结果,若有有效链表,则先取第一个链表作为初始合并结果,随后从第二个链表起循环调用合并两链表的函数,不断更新合并结果,直至处理完所有链表,最终返回合并好的链表头节点,其时间复杂度为 O(kn)( k为链表个数, n为平均链表长度),空间复杂度为 O(1)。


具体代码

cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTWOLists(ListNode* a,ListNode* b) {
        ListNode *xt=new ListNode(-1);
        ListNode *tail=xt;
        while(a&&b)
        {
            if(a->val<b->val)
            {
                tail->next=a;
                a=a->next;
            }
            else
            {
                tail->next=b;
                b=b->next;
            }tail=tail->next;
        }
        if(a)tail->next=a;
        else tail->next=b;
        return xt->next;
    }
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        if(lists.empty())return nullptr;
        ListNode *res=lists[0];
        for(int i=1;i<lists.size();i++)
        {
            if(lists[i])res=mergeTWOLists(res,lists[i]);
        }return res;
    }
};

这段代码中,Solution类里的mergeTwoLists函数用于合并两个有序链表,通过创建虚拟头节点,利用循环比较两链表当前节点值大小并按需连接,循环结束后处理剩余节点,最终返回合并后链表头节点;mergeKLists函数则是处理多个有序链表的合并,先判断链表数组是否为空,非空时取首个链表为初始结果,再循环调用mergeTwoLists函数依次合并剩余链表,最后返回合并好的完整有序链表的头节点,整体实现了将多个升序链表合并为一个升序链表的功能。

相关推荐
CoovallyAIHub12 小时前
Moonshine:比 Whisper 快 100 倍的端侧语音识别神器,Star 6.6K!
深度学习·算法·计算机视觉
CoovallyAIHub14 小时前
速度暴涨10倍、成本暴降6倍!Mercury 2用扩散取代自回归,重新定义LLM推理速度
深度学习·算法·计算机视觉
CoovallyAIHub14 小时前
实时视觉AI智能体框架来了!Vision Agents 狂揽7K Star,延迟低至30ms,YOLO+Gemini实时联动!
算法·架构·github
CoovallyAIHub14 小时前
开源:YOLO最强对手?D-FINE目标检测与实例分割框架深度解析
人工智能·算法·github
CoovallyAIHub14 小时前
OpenClaw:从“19万星标”到“行业封杀”,这只“赛博龙虾”究竟触动了谁的神经?
算法·架构·github
刀法如飞14 小时前
程序员必须知道的核心算法思想
算法·编程开发·算法思想
徐小夕16 小时前
pxcharts Ultra V2.3更新:多维表一键导出 PDF,渲染兼容性拉满!
vue.js·算法·github
CoovallyAIHub17 小时前
OpenClaw一脚踩碎传统CV?机器终于不再只是看世界
深度学习·算法·计算机视觉
CoovallyAIHub17 小时前
仅凭单目相机实现3D锥桶定位?UNet-RKNet破解自动驾驶锥桶检测难题
深度学习·算法·计算机视觉