目录

一:题目

二:算法原理

三:代码

四:递归相关总结


一:题目

题目链接:https://leetcode.cn/problems/merge-two-sorted-lists/


二:算法原理


三:代码

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) 
    {
        //递归出口
        if(l1 == nullptr)  return l2;
        if(l2 == nullptr)  return l1;

        //比较两个节点大小,选择小节点
        if(l1->val <= l2->val)
        {
            l1->next = mergeTwoLists(l1->next,l2);
            return l1;
        }
        else
        {
            l2->next = mergeTwoLists(l1,l2->next);
            return l2;
        }
    }
};

四:递归相关总结

1.循环 VS 递归

循坏(迭代)与递归本质上都是解决重复的子问题,所以二者在理论上是可以转换的

例如上面数组的打印,使用循环和递归都可以做到

但是在实践过程中,有的时候使用循环方便,而有的时候使用递归方便,我们应该在什么情况下使用循环,什么时候使用递归呢?

2.递归 VS 深搜

递归的展开图实际上就是一颗树做一次深度优先遍历,所以二者没有区别

我们应该在什么情况下使用循环,什么时候使用递归呢?对于这个问题的解决,就与深搜是树的形状有关

但并不是所有情况都是这样,有的题目如果有特殊要求需要储存一些特殊信息什么的,可能此时使用循环也会比较麻烦

3.先序遍历 VS 后续遍历

递归的位置不同打印的顺序也会产生不同

中序遍历是二叉树特有的打印方式,多叉树中只有先序遍历和后序遍历

更多推荐