递归-21.合并两个有序链表-力扣(LeetCode)

个人主页1白天的黑夜1-CSDN博客

专栏:力扣刷题录_1白天的黑夜1的博客-CSDN博客企鹅程序员:Linux 系统与网络编程_1白天的黑夜1的博客-CSDN博客

目录

一、题目解析

1、合并两个有序链表

2、新链表节点是由给定两个链表拼接而成的

二、算法原理

解法:递归

如何写递归代码?

1、重复的子问题->函数头设计

2、只关心某一个子问题做什么->设计函数体

3、递归的出口

对于链表类的题,还是建议多画图,去体会链接的过程,题目链接放在下面,可以去动手敲敲

三、代码示例

四、递归展开图

看到最后,如果对您有所帮助,还请点赞、收藏和关注一键三连,在未来还会继续带来优秀的内容,感谢观看,我们下期再见!


一、题目解析

1、合并两个有序链表

2、新链表节点是由给定两个链表拼接而成的

二、算法原理

相信读者们在学习链表的时候,已经了解了通过循环实现链表的合并,本篇博客的目的是为了介绍用递归的思想来解决链表合并,下面开始进入正题。

解法:递归

还是和之前的一样,先分析合并的过程,看能不能从中找到子问题或者一些重复的行为

首先会注意到一点,我们合并的时候是有选择的,然后我们会把一个较小的节点作为下一个合并的节点。而且我们还注意到了并不是每次的节点都不为空,如果为空,则返回另一个节点;如果都为空则返回nullptr。

如何写递归代码?

1、重复的子问题->函数头设计

如何理解重复的子问题呢?我们在合并的时候选出了一个节点做头,那么我只需要把剩下的节点合并起来,返回合并后的头指针,我们直接更改指向就可以了,而剩下的节点也根据需求选出一个头节点,剩下的节点合并起来,由此发现了重复的子问题。递归函数f需要返回头指针,所以返回值类型为ListNode*,由于合并需要两个头指针,所以参数为两个待合并链表的指针。类似ListNode* f(l1,l2),这是不是很像题目给的函数,所以题目给的函数头可以直接使用。

2、只关心某一个子问题做什么->设计函数体

就像我们上面分析的一样,需要对两个头指针存储的值进行比较,较小的那一个称为头节点(这里可以使用swap函数);由于我相信递归函数可以帮我完成任务(即将剩余的节点链接起来,返回一个头指针),所以再次调用递归函数传入做头结点的next和另一个头节点本身,我们只需将头节点的next指向递归函数的返回值即可。类似l1->next = f(l1->next,l2)。

3、递归的出口

当一个节点为空时,返回另一个非空节点;如果两个节点都为空,则返回nullptr。if else判断即可。

对于链表类的题,还是建议多画图,去体会链接的过程,题目链接放在下面,可以去动手敲敲

21. 合并两个有序链表 - 力扣(LeetCode)

三、代码示例

cpp 复制代码
class Solution {
public:
    //递归
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2)
    {
        if(list1 == nullptr) return list2;
        if(list2 == nullptr) return list1;
        if(!list1&&!list2) return nullptr;
        if(list1->val >= list2->val) swap(list1,list2);
        list1->next = mergeTwoLists(list1->next,list2);
        return list1;
    }
};

四、递归展开图

这里依旧简单模拟一下,1->2->4和1->3,作为合并的两个链表

还是画的比较难看,就只能委屈各位读者朋友了。

看到最后,如果对您有所帮助,还请点赞、收藏和关注一键三连,在未来还会继续带来优秀的内容,感谢观看,我们下期再见!

相关推荐
不会代码的小猴11 分钟前
21. 泛型编程上
开发语言·c++·笔记·算法
营养充电站24 分钟前
VS Code Git 工作树:解锁多分支并行开发的高效体验
leetcode·决策树·逻辑回归·散列表·模拟退火算法
青瓦梦滋35 分钟前
传输层UDP/TCP协议
linux·网络·c++·网络协议·tcp/ip·udp
一只旭宝1 小时前
细讲C加加【9】C++ std::function与std::bind详解|仿函数、绑定器、类成员绑定、占位符、成员偏移指针
开发语言·c++·算法
良木林1 小时前
子串 - LeetCode hot 100
算法·leetcode·职场和发展
蒸蒸yyyyzwd2 小时前
秋招不熟悉力扣学习笔记1
笔记·学习·leetcode
Lhan.zzZ3 小时前
在 Visual Studio 2022 中打造可扩展的动态链接库模块:从零搭建到原理解析
开发语言·c++·visual studio
LuminousCPP4 小时前
数据结构-双向循环链表
c语言·数据结构·笔记·链表
zh路西法5 小时前
【3D SLAM源码解读系列】(二)Small_gicp——5 个积木搭出最优点云配准
c++·pcl·icp·fastgicp·smallgicp·gicp
fpcc7 小时前
ubuntu26环境下的开发环境安装处理
c++·并行编程