Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【递归】合并两个有序链表

【递归】合并两个有序链表

作者头像
利刃大大
发布于 2025-05-22 05:31:05
发布于 2025-05-22 05:31:05
8300
代码可运行
举报
文章被收录于专栏:csdn文章搬运csdn文章搬运
运行总次数:0
代码可运行

21. 合并两个有序链表

21. 合并两个有序链表

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

示例 1:

img
img
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

示例 2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:l1 = [], l2 = []
输出:[]

示例 3:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:l1 = [], l2 = [0]
输出:[0]

提示:

  • 两个链表的节点数目范围是 [0, 50]
  • -100 <= Node.val <= 100
  • l1l2 均按 非递减顺序 排列

解题思路:递归

​ 合并两个有序链表其实用迭代的方法看起来很直观,但是它同样能够利用递归来解决,以题目给的样例为例,有两个指针 list1list2 分别指向两个有序链表的头节点,我们每次只要找到小的那个节点将其返回,然后剩下的事情交给剩余节点去比较然后进行返回即可。

​ 可以发现对每个节点的操作其实都是一样的,都是比较当前两个节点的大小然后进行返回,所以我们就可以将每个相同的操作抽象出来作为递归函数体,然后我们只需要设计函数头和处理递归出口即可!

​ 下面还是分三步走:

函数头的设计

因为我们只需要有两个指针 list1list2 来进行比较,最后返回的就是较小的那个节点,又因为题目给的函数头刚刚好就符合要求,所以就直接用题目给的函数即可,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2);

函数体的设计

每次我们返回两个指针中小的那个即可,但是在返回之前,我们需要将当前的节点,假如当前 list1 节点较小,那么我们在返回 list1 之前,需要处理一下 list1->next,让它调用 mergeTwoLists() 继续递归下去,传的参数其中就不再是 list1 了,而是 list1->next,也就是让 list1->nextlist2 进行比较,以此类推,对于 list2 来说也是同样的操作,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 比较大小,然后处理list->next交给递归函数继续处理,最后再返回当前节点
if(list1->val <= list2->val)
{
    list1->next = mergeTwoLists(list1->next, list2);
    return list1;
}
else
{
    list2->next = mergeTwoLists(list1, list2->next);
    return list2;
}

递归终止条件

很明显,当两个链表指针走到空的时候就是递归的终止时候,如果说 list1 走到空了,那么我们可以返回 list2,就算 list2 此时为空也没事;同样,如果 list2 走到空了,此时直接返回 list1 即可!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 递归出口条件
        if(list1 == nullptr)
            return list2;
        if(list2 == nullptr)
            return list1;

完整代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 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) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        // 递归出口条件
        if(list1 == nullptr)
            return list2;
        if(list2 == nullptr)
            return list1;

        // 比较大小,然后处理list->next交给递归函数继续处理,最后再返回当前节点
        if(list1->val <= list2->val)
        {
            list1->next = mergeTwoLists(list1->next, list2);
            return list1;
        }
        else
        {
            list2->next = mergeTwoLists(list1, list2->next);
            return list2;
        }
    }
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
加入讨论
的问答专区 >
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
    本文部分代码块支持一键运行,欢迎体验
    本文部分代码块支持一键运行,欢迎体验