力扣刷题#15:LeetCode0021 合并两个有序链表

题目

将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

输入:l1 = [1, 2, 4], l2 = [1, 3, 4]
输出:[1, 1, 2, 3, 4, 4]

我的初始思路

看到这道题,我立刻想到了双指针——两个链表同时跑,指针对应的节点进行比较,然后转移链接方向。

但是,我卡在了一个很基础的问题上:

我不知道如何遍历链表。指针怎么找到下一个?链表能用下标去找节点吗?

第一个阶段刷的全是数组题,习惯了 nums[i] 用下标跳来跳去。突然面对链表,脑子还是数组模式。


关键顿悟:链表没有下标

数组和链表的遍历方式完全不同:

数组 链表
连续内存,可以随机访问 分散内存,只能顺序走
arr[i] 直接跳到第 i 个 p = p->next 顺着指针往前走一步
像公寓,每间房有门牌号 像一串珠子,只能顺着线摸过去

链表走下一步:p = p->next。不能跳,只能一步一步顺着 next 指针走。


我的通过代码

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode dummy(0);           // 哑节点
        ListNode* tail = &dummy;      // 尾巴指针

        while (l1 && l2) {            // 两串都还有珠子
            if (l1->val < l2->val) {
                tail->next = l1;      // 尾巴牵上 l1
                l1 = l1->next;        // l1 往前走一颗
                tail = tail->next;    // 尾巴也往前走一颗
            } else {
                tail->next = l2;
                l2 = l2->next;
                tail = tail->next;
            }
        }

        // 有一条链走完了,把剩下的全接上去
        if (l1) tail->next = l1;
        if (l2) tail->next = l2;

        return dummy.next;            // 真正的头是哑节点的下一个
    }
};

代码中的关键点

1. 哑节点(dummy node)

新链表最开始是空的,第一个节点该挂在哪?用一个不存数据、只占位置的"哑节点"来解决。它让代码不用单独处理"头为空"的特殊情况。最后返回 dummy.next 就行。

2. tail 指针

tail 始终指向新链表的最后一个节点。每挂上一个新节点,tail 就跟着往前走一步。这样下一个节点直接 tail->next 就能挂上。

3. while 循环条件

while (l1 && l2) — 只要两条链都还有节点,就继续比较。有一条走完了就跳出,把剩下的那条整体接上即可。

4. 收尾

if (l1) tail->next = l1;
if (l2) tail->next = l2;

剩下的那条链本身就是有序的,且全部都比已经合并完的大,直接整体接上去就行。


学到的知识点

数组 → 链表的思维转变

第一阶段刷的全是数组,所有操作都是围绕下标展开。现在切换到链表,需要建立一个新的肌肉记忆:

操作 数组 链表
遍历 for (int i = 0; i < n; i++) for (auto p = head; p; p = p->next)
访问下一个 nums[i+1] p->next
判尾 i == nums.size() p == nullptr
长度 nums.size() 需要自己遍历统计

哑节点是链表题的必备技巧

跟数组题的"双指针模板"一样,哑节点是链表题的"通用模板"。它的作用就是让头节点不再特殊——所有节点都统一用 tail->next = xxx 的方式挂上去。

合并的本质是归并

这道题的逻辑和归并排序中"合并两个有序数组"的步骤完全一样——只是把数组下标换成了链表指针。理解了这一点,归并排序的合并部分也就懂了。


复杂度分析

维度 说明
时间复杂度 O(n + m) 两个链表的每个节点各访问一次
空间复杂度 O(1) 只用了几个指针,原地操作

本文档由 AI 辅助生成,作者提供问题,思路和代码,AI仅负责文本修饰,综合获得以上内容。

posted @ 2026-06-12 23:32  STA_running  阅读(6)  评论(0)    收藏  举报