【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;
    }
};
相关推荐
海石29 分钟前
单调栈复健,顺便,牺牲一下吧,空间复杂度!一切献给AC
算法·leetcode
海石30 分钟前
JS击败94%,Hard题想不到动态规划,那就用数组和栈试试
算法·leetcode
aaPIXa62239 分钟前
C++模板元编程:编译期计算Fibonacci数列
java·开发语言·c++
Augustzero1 小时前
`co_await` 按下暂停键之后:从零看懂 C++20 协程
c++·后端
知无不研1 小时前
c语言和c++中的静态关键字
开发语言·c++·静态关键字
思麟呀2 小时前
在C++基础上理解CSharp-7
java·jvm·c++·c#
2601_949818092 小时前
Vector从入门到应用(C++ STL动态数组万字全解
开发语言·c++
汉克老师3 小时前
GESP2026年6月认证C++八级( 第三部分编程题(1、线网建设))精讲
c++·最小生成树·排序·kruskal·并查集·gesp8级
胖大和尚3 小时前
Linux 内核工程师、HPC工程师、C++工程师
c++·kernel·hpc
alphaTao3 小时前
LeetCode 每日一题 2026/7/6-2026/7/12
算法·leetcode