跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ 递归实战:合并有序链表与反转链表

演示 C++ 中递归解决链表问题的两种经典场景。合并有序链表通过比较当前节点值,将较小节点链接到剩余子列表的递归结果上;反转链表则利用递归到达尾部后,在回溯阶段逐层调整指针指向。重点在于理解递归栈中的状态回退与指针重连,建议配合画图理清节点关系。

时间旅人发布于 2026/3/30更新于 2026/7/2335 浏览
C++ 递归实战:合并有序链表与反转链表

合并两个有序链表

在递归处理链表时,核心在于定义好函数的语义。对于合并两个有序链表,我们可以将问题拆解为:比较当前两个节点的值,较小的那个作为结果链表的头,剩下的部分交给递归函数继续处理。

思路解析

  1. 基准情况:如果其中一个链表为空,直接返回另一个链表。这是递归的终止条件。
  2. 递归步骤:比较 list1 和 list2 的头节点值。假设 list1 较小,那么 list1 就是当前合并后链表的头。接下来,我们需要把 list1->next 和 list2 合并的结果接在 list1 后面。
  3. 指针操作:务必画图辅助理解。递归返回的是'剩余部分合并后的头',我们只需要调整当前节点的 next 指针指向它即可。

C++ 代码实现

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        // 基准情况:任一链表为空,返回另一链表
        if (list1 == nullptr) return list2;
        if (list2 == nullptr) return list1;

        // 选择较小的节点作为当前头结点
        if (list1->val < list2->val) {
            list1->next = mergeTwoLists(list1->next, list2);
            return list1;
        } else {
            list2->next = mergeTwoLists(list2->next, list1);
            return list2;
        }
    }
};

这段代码简洁地体现了分治思想。每次递归调用都缩小了问题规模,直到遇到空指针。实际调试时,建议打印中间状态或画图确认指针指向,避免死循环。


反转链表

反转链表是递归的经典应用。它的难点在于回溯阶段如何重新连接节点。

思路解析

  1. 递归语义:函数接收一个头节点,返回逆序后的新头节点。
  2. 递归过程:先递归处理 head->next 之后的链表。当递归返回时,意味着从第二个节点开始的链表已经反转好了。
  3. 回溯连接:此时 head 还是原链表的第二个节点(逻辑上),而 head->next 已经是反转后子链表的尾节点。我们需要让 head->next->next = head,并将 head->next 置空,完成当前节点的翻转。
  4. 终止条件:当 head 为空或 head->next 为空时,说明只剩一个节点或没有节点,直接返回 head。

C++ 代码实现

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        // 终止条件:空表或单节点
        if (head == nullptr || head->next == nullptr) return head;

        // 递归反转后续链表,newhead 是新链表的头
        ListNode* newhead = reverseList(head->next);

        // 回溯阶段:调整指针方向
        head->next->next = head;
        head->next = nullptr;

        return newhead;
    }
};

注意这里的 head->next->next = head,这行代码容易让人困惑。它的意思是:原本 head 指向 head->next,现在要让 head->next 指回 head。配合 head->next = nullptr 切断旧链接,就实现了局部反转。

总结

这两道题展示了递归在处理链表结构时的强大之处。关键在于明确递归函数的返回值含义,以及利用栈的回溯特性来修改指针。练习时多画图,理清每一层递归中节点的指向变化,能极大降低理解难度。

目录

  1. 合并两个有序链表
  2. 思路解析
  3. C++ 代码实现
  4. 反转链表
  5. 思路解析
  6. C++ 代码实现
  7. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 位运算实战:判断字符唯一性与查找丢失数字
  • 基于 SpringBoot 的图书租借系统设计与实现
  • AI 对话应用接口开发:同步、SSE 流式与智能体前端对接
  • SpiffWorkflow:纯 Python 实现的工作流引擎
  • SKResNet 架构详解:融合选择性卷积与残差结构
  • OpenClaw 底层原理深度解析:本地优先的任务执行系统
  • AnythingLLM:零成本搭建私人 ChatGPT,支持主流大模型
  • Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码
  • 前端常用加密方式与算法解析
  • Flutter 底部导航与 TabBar 多页切换实战及状态保持
  • OpenClaw 多飞书机器人绑定配置实战指南
  • 实战 LLaMA Factory:在国产 DCU 上高效微调 Llama 3 模型
  • STL 文件预览工具:使用 stl-thumb 生成 3D 模型缩略图
  • 无需公网 IP 安全远程访问本地 AI 服务方案
  • 纯 HTML 实现的交互式星球漫游效果
  • 大模型原理基础:从感知机到神经网络
  • Xilinx SRIO IP 核与 FPGA 实现仿真流程
  • 人工智能发展历程与现状分析
  • Cesium 无人机智能航线规划:航点动作组与 AI 识别实战
  • Ubuntu 环境下 RabbitMQ 快速安装与配置指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online