【Hot 100 刷题计划】 LeetCode 23. 合并 K 个升序链表 | C++ 顺序合并

LeetCode 23. 合并 K 个升序链表

📌 题目描述

题目级别:困难 (Hard)

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

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

  • 示例 1:
    输入:lists = [[1,4,5],[1,3,4],[2,6]]
    输出:[1,1,2,3,4,4,5,6]

💡 破题思路:顺序合并 (Sequential Merge)

合并 KKK 个链表最朴素、最容易理解的思路就是:"化繁为简,两两合并"

我们可以把这个问题拆解为:

  1. 基础组件 :写一个辅助函数 mergeTwoLists,专门负责合并两个有序链表。这部分你使用了经典的 Dummy 节点 迭代法,逻辑非常严密。
  2. 主逻辑 :初始化一个结果链表 res。然后遍历整个链表数组,通过 res = mergeTwoLists(res, tt),像"滚雪球"一样,把数组里的每一个链表依次合并到 res 中。

💻 C++ 代码实现 (原汁原味作者版)

cpp 复制代码
class Solution {
public:
    // 辅助函数:合并两个升序链表
    ListNode* mergeTwoLists(ListNode* a, ListNode* b)
    {
        // 边界处理:若其中一个为空,直接返回另一个
        if (!a || !b) return a ? a : b;
        ListNode *dummy = new ListNode(0);
        ListNode *cur = dummy;

        while (a && b)
        {
            if (a->val < b->val)
            {
                cur->next = a;
                a = a->next;
            }
            else 
            {
                cur->next = b;
                b = b->next;
            }
            cur = cur->next;
        }

        // 拼接剩余部分
        cur->next = a ? a : b;
        return dummy->next;
    }

    ListNode* mergeKLists(vector<ListNode*>& lists) {
        ListNode *res = nullptr;
        // 顺序合并:将数组中的链表一个接一个合并到 res 中
        for (auto tt : lists)
        {
            res = mergeTwoLists(res, tt);
        }

        return res;
    }
};
相关推荐
charlie1145141912 小时前
Cinux —— 给物理内存建账本:bitmap 物理内存管理器
开发语言·c++·操作系统·开源项目
2301_777998344 小时前
Linux线程同步与互斥(三):信号量与环形队列实现生产者消费者模型
linux·c语言·c++
啦啦啦啦啦zzzz4 小时前
设计模式:单例模式和工厂模式
c++·单例模式·设计模式·工厂模式
Henry Zhu1234 小时前
C++ 动态多态详解
c++
此生决int4 小时前
深入理解C++系列(06)——模版初阶与STL
开发语言·c++
c238565 小时前
《枚举算法 “翻译官”:用 enum class 给 “游游的礼盒” 算分》
c语言·c++·算法
noipp5 小时前
推荐题目:洛谷 P5843 [SCOI2012] Blinker 的噩梦
c语言·数据结构·c++·算法·游戏·洛谷·luogu
鱼子星_5 小时前
《算 · 法》题目解析篇(1):最近公共祖先问题,线段树,最长回文子序列
c++·算法·动态规划·递归
Hi李耶6 小时前
【LeetCode】9-回文数
算法·leetcode·职场和发展
计算机内卷的N天7 小时前
CMake与Visual Studio的使用
c++·ide·visual studio