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/17 22:50:26

YOLO26 接入实时视频

1. 创建环境conda create --name yolo_new python3.102. 安装 yolopip install -U ultralytics3. 编写获取视频代码1. 环境&#xff1a;MacOS iphone 摄像头2. 导入相应的头文件import cv2 from ultralytics import solutions2. 获取摄像头def open_iphone_camera_with_cv():&…

作者头像 李华
网站建设 2026/4/18 8:46:34

毕业论文答辩PPT的终极解决方案:ChatPPT如何让我从焦虑到从容应对

毕业论文答辩PPT的终极解决方案&#xff1a;ChatPPT如何让我从焦虑到从容应对 凌晨两点&#xff0c;宿舍灯光下&#xff0c;我盯着电脑屏幕上三万字的论文&#xff0c;手指在键盘上悬停了十分钟——如何把这篇密密麻麻的文字浓缩成20页PPT&#xff1f;这曾是每个毕业生的噩梦。…

作者头像 李华
网站建设 2026/4/17 14:25:31

从混沌到秩序:Lisp家族的演化与ANSI标准化的必然

从混沌到秩序&#xff1a;Lisp家族的演化与ANSI标准化的必然 1.1.1 Lisp的基因溯源&#xff1a;从λ演算到符号计算革命 Lisp的诞生可以追溯到1958年&#xff0c;由John McCarthy在MIT发明。其核心灵感来源于Alonzo Church的λ演算&#xff0c;这一数学模型构成了现代函数式编程…

作者头像 李华
网站建设 2026/4/18 13:48:13

基于STM32单片机共享无线充电锂电池充电宝系统设计DIY21-640

本系统由STM32F103C8T6单片机核心板、继电器控制、蓝牙控制及电源组成。1、手机连接蓝牙设备。2、设备上贴有二维码&#xff0c;通过手机可以扫描&#xff0c;如果二维码解析正确&#xff0c;可以控制打开共享设备的继电器。3、如果使用完需要关闭设备开关&#xff08;即继电器…

作者头像 李华