【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;
    }
};
相关推荐
_Narcissus_3 小时前
动态规划初探(含完整代码实现)
c语言·数据结构·c++·算法·动态规划·背包问题·最短路径
法哥20124 小时前
用 C++ 控制 CMW100,到底在干什么?
开发语言·c++
_Narcissus_5 小时前
枚举和模拟算法笔记
c语言·数据结构·c++·笔记·算法·模拟·枚举
冻柠檬飞冰走茶5 小时前
《数据结构实验指导-C++语言版》 在顺序表 list 中查找元素 x
开发语言·数据结构·c++·算法·list
Brilliantwxx5 小时前
【C++】 高阶数据结构图(1)并查集
开发语言·数据结构·c++
小鱼仙官6 小时前
Ubuntu C++ NTP校时程序
linux·c++·ubuntu
冻柠檬飞冰走茶6 小时前
《数据结构实验指导-C++语言版》 返回单链表 list 中第 i 个元素值
开发语言·数据结构·c++·算法·list
老当益壮梁奶奶7 小时前
Linux软件编程学习笔记(二)Linux文件IO编程入门:从fopen到fgetc
linux·c语言·c++·笔记·学习
雪的季节7 小时前
C++ 高级(泛型编程与模板)(有空再研究吧)
c++
三十岁老牛再出发7 小时前
8月21日总结
c++·python