news 2026/4/18 12:25:52

《C++ 递归、搜索与回溯》第2-3题:合并两个有序链表,反转链表

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《C++ 递归、搜索与回溯》第2-3题:合并两个有序链表,反转链表

《C++ 递归、搜索与回溯》第2-3题:合并两个有序链表 & 反转链表
(2026年清晰 + 优雅写法推荐)

这两道题都是链表操作的经典题目,同时也是考察递归思维迭代思维转换的绝佳练习题。下面给出最常用、最清晰的几种写法,并标注优缺点与推荐场景。

题目1:合并两个有序链表(Merge Two Sorted Lists)

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

示例

输入:l1 = 1→2→4, l2 = 1→3→4 输出:1→1→2→3→4→4
解法对比(推荐程度排序)
序号写法空间复杂度可读性推荐指数备注与适用场景
1递归(最优雅)O(n+m)★★★★★★★★★★面试首选,代码最短最美
2迭代(哑节点)O(1)★★★★☆★★★★☆最稳,生产环境最常用(空间最优)
3迭代(不使用哑节点)O(1)★★★☆☆★★☆☆☆边界处理麻烦,不推荐

推荐写法1:递归(最推荐面试写法)

/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */classSolution{public:ListNode*mergeTwoLists(ListNode*list1,ListNode*list2){// 递归终止条件:有一个链表为空,直接返回另一个if(list1==nullptr)returnlist2;if(list2==nullptr)returnlist1;// 选择较小的一个作为头节点,递归处理剩余部分if(list1->val<list2->val){list1->next=mergeTwoLists(list1->next,list2);returnlist1;}else{list2->next=mergeTwoLists(list1,list2->next);returnlist2;}}};

一句话记忆递归版精髓
“谁小谁当头,头后面接上剩下的两个链表的合并结果”

推荐写法2:迭代 + 哑节点(生产最稳)

classSolution{public:ListNode*mergeTwoLists(ListNode*list1,ListNode*list2){ListNodedummy(0);// 哑节点(虚拟头节点)ListNode*tail=&dummy;// 尾指针,用于拼接while(list1&&list2){if(list1->val<list2->val){tail->next=list1;list1=list1->next;}else{tail->next=list2;list2=list2->next;}tail=tail->next;// 尾指针后移}// 剩余部分直接接上(最多剩一条链表)tail->next=list1?list1:list2;returndummy.next;}};

题目2:反转链表(Reverse Linked List)

题目描述
给你单链表的头节点head,请你反转链表,并返回反转后的链表。

示例

输入:head = 1→2→3→4→5 输出:5→4→3→2→1
解法对比
序号写法空间复杂度可读性推荐指数备注与适用场景
1递归(优雅版)O(n)★★★★★★★★★☆面试加分项,理解递归本质好
2迭代(三指针)O(1)★★★★☆★★★★★最稳、最常用、生产首选
3头插法O(1)★★★☆☆★★★☆☆写法简单,但边界容易错

推荐写法1:迭代三指针(最推荐生产写法)

classSolution{public:ListNode*reverseList(ListNode*head){ListNode*prev=nullptr;ListNode*curr=head;while(curr){ListNode*nextTemp=curr->next;// 先保存下一个节点curr->next=prev;// 反指prev=curr;// 前进一步curr=nextTemp;}returnprev;// 最后prev就是新头}};

推荐写法2:递归(面试炫技版)

classSolution{public:ListNode*reverseList(ListNode*head){// 终止条件:空链表或只有一个节点,直接返回if(!head||!head->next){returnhead;}// 递归到最后一个节点(新头)ListNode*newHead=reverseList(head->next);// 反转指针:当前节点的下一个节点的下一个指向当前节点head->next->next=head;// 断开原连接(防止形成环)head->next=nullptr;returnnewHead;}};

递归版一句话理解
“先递归到链表尾部,然后从后向前依次把每个节点的next指针反指回来”

总结对比表(快速背诵)

题目推荐写法优先级空间时间面试得分生产稳健度
合并有序链表递归 > 迭代哑节点O(n)O(n+m)递归最高迭代最高
反转单链表迭代三指针 > 递归O(1)O(n)递归炫技迭代最高

建议练习顺序

  1. 先手写迭代版合并迭代版反转(最稳)
  2. 再写递归版两种(加深递归理解)
  3. 最后尝试不看代码默写两道题的递归+迭代各一遍

这两道题练熟了,链表递归的“从后向前处理”思维就会非常扎实,为后续的很多题目(如回文链表、链表排序、LRU缓存等)打下坚实基础。

你现在想继续练哪一道?
或者想看这两道题的进阶变形(如K个一组翻转、排序链表等)?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 11:04:01

基于 Spring Boot 的 Web 三大核心交互案例精讲

基于 Spring Boot 的 Web 三大核心交互案例精讲 &#xff08;2026年最实用写法 企业真实场景&#xff09; 在 Spring Boot Web 开发中&#xff0c;真正决定项目质量和维护难度的&#xff0c;往往不是写了多少 Controller&#xff0c;而是你是否真正掌握了以下三大核心交互场景…

作者头像 李华
网站建设 2026/4/18 7:23:20

【AI大模型开发】-基于向量数据库的PDF智能问答系统(实战)

ChatPDF-Faiss&#xff1a;基于向量数据库的PDF智能问答系统 一、项目概述 ChatPDF-Faiss是一个基于向量数据库技术的PDF智能问答系统&#xff0c;它能够将PDF文档内容转换为向量表示并存储在FAISS向量数据库中&#xff0c;用户可以通过自然语言提问获取文档中相关信息的精确…

作者头像 李华
网站建设 2026/4/18 7:01:06

2026标杆企业游学 | 为什么会选择字节跳动上海总部?

字节跳动上海总部&#xff0c;是其全球化战略的超级引擎&#xff0c;更是Zhong国互联网创新的前沿阵地。这里汇聚抖音、飞书、TikTok等核心产品研发力量&#xff0c;坐拥20万平方米智慧办公空间&#xff0c;日均处理数据量超千万亿级。参访者将直击字节“始终创业”的文化内核&…

作者头像 李华
网站建设 2026/4/18 9:42:52

基于 Flutter × OpenHarmony 构建便签列表视图

文章目录基于 Flutter OpenHarmony 构建便签列表视图前言背景Flutter OpenHarmony 跨端开发介绍开发核心代码代码设计解析1. 空态处理&#xff08;Empty State&#xff09;2. 主题适配&#xff08;ThemeData&#xff09;3. 网格化列表展示4. 组件拆分心得总结基于 Flutter O…

作者头像 李华
网站建设 2026/4/18 7:03:10

QUdpSocket的readyRead信号触发时机解析

1.QUdpSocket的readyRead信号发送的时机 QUdpSocket 的 readyRead() 信号是在 有新的 UDP 数据报到达套接字的接收缓冲区&#xff0c;并且应用程序 尚未读取这些数据 时发出的。 具体来说&#xff0c;其触发时机如下&#xff1a; ✅ 触发条件 UDP 数据报已到达本地主机 并被…

作者头像 李华