递归-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,作为合并的两个链表

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

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

相关推荐
嫩萝卜头儿1 小时前
2 - 复杂度收尾 + 链表经典OJ
数据结构·算法·链表·复杂度
玛丽莲茼蒿2 小时前
Leetcode hot100 每日温度【中等】
算法·leetcode·职场和发展
样例过了就是过了2 小时前
LeetCode热题100 分割等和子集
数据结构·c++·算法·leetcode·动态规划
麦兜和小可的舅舅2 小时前
ClickHouse 列管理机制解析:从 COW、IColumn 到 CRTP
c++·clickhouse
北顾笙9802 小时前
day38-数据结构力扣
数据结构·算法·leetcode
m0_629494732 小时前
LeetCode 热题 100-----14.合并区间
数据结构·算法·leetcode
xin_nai3 小时前
LeetCode热题100(Java)(5)普通数组
算法·leetcode·职场和发展
旖-旎3 小时前
深搜练习(组合)(5)
c++·算法·深度优先·力扣
vegetablesssss3 小时前
vtk镜像图
c++·qt·vtk
@小码农3 小时前
2026年3月Scratch图形化编程等级考试一级真题试卷
开发语言·数据结构·c++·算法