递归专题(2)——合并链表

🔥近津薪荼:个人主页

🎬个人专栏:《c语言基础知识详解》《c++基础知识详解》《Linux操作系统及网络基础知识分享》《近津薪荼的算法日迹》

人最害怕的是什么?是迈出新的一步,说出新的话。

------《罪与罚》


1.上期参考代码:

cpp 复制代码
class Solution {
public:
    void hanota(vector<int>& A, vector<int>& B, vector<int>& C) {
        bfs( A, B, C, A.size());
    }
    void bfs(vector<int>& A, vector<int>& B, vector<int>&C, int n)
        {
            if(n==1)
            {
              C.push_back(A.back());
              A.pop_back();
              return;
            }//出口
            bfs(A,C,B,n-1);
            C.push_back(A.back());
            A.pop_back();
            bfs(B,A,C,n-1);
        }
};
    

2.本期知识点导图

3.本期要讲解的题目是:

合并两个有序链表

要点:

  • 升序
  • 新链表由原链表拼接而成(不准new)

4.解题:

4.1迭代

合并链表的经典方法是迭代法(就是循环),不是本期讲解的重点,代码就直接给出了:

cpp 复制代码
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode* preHead = new ListNode(-1);//哨兵位
        ListNode* prev = preHead;
        while (l1 != nullptr && l2 != nullptr) {
            if (l1->val < l2->val) {
                prev->next = l1;
                l1 = l1->next;
            } else {
                prev->next = l2;
                l2 = l2->next;
            }
            prev = prev->next;
        }

        // 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可
        prev->next = l1 == nullptr ? l2 : l1;

        return preHead->next;
    }
};

4.2递归:

观察问题,我们需要解决的问题是,按序合并两个有序链表,那么链表的首个节点一定是两个链表首节点中较小 的那一个,找到它,用它作首节点,指向由本链表和另一个链表合并而成的链表的首节点,那么就要再次合并链表。

于四,我们找到了那个递归必须的

重复子问题合并链表

同时找到了

子问题具体要干啥找较小首节点,指向剩下链表和另一链表合并之后的首节点。

那么就差找到出口了,我们函数有返回值,返回的是之前找的头结点所要指向的节点的地址

我们一直合并链表,链表就会不断变短,迟早有一个会先变空,如果空了就返回另一个链表的首地址即可,另一个没空的剩下来的一定符合要求。此时方可停止递推,开始递归。

5.代码逻辑

1.出口:一个链表先空,返回另一个链表

2.重复子问题:合并链表(函数头)

3.子问题具体要干啥:如上述

6.小知识点:

1.循环和递推往往是能相互转化的,不知道大家有没有发现他们都是在解决重复子问题

但是有的题目适合用递归,有的题目适合用循环,有兴趣大家可以去搜一搜什么时候,用哪个。

2.上一期中,我给大家画了递归的递推图,大家仔细观察的话不难发现,它的逻辑和二叉树的中序遍历非常像,也就与我们的dfs逻辑非常像,也因此大家要学好dfs递归基础不得少哈。

7.下期要讲解的题目是:

反转链表

下期见

相关推荐
浔溺1 小时前
al+大数据每日学习笔记28
笔记·学习
1000世界小札6 小时前
《大话数据结构》第9章精读:归并排序与快速排序完整 C++ 实现
数据结构·c++·算法
2601_956121978 小时前
背包基础篇(01、完全、分组、多重、混合)
c++·算法·动态规划
fpcc8 小时前
跟我学C++中级篇——编译期的条件选择
开发语言·c++
xian_wwq9 小时前
【学习笔记】-深度认知系列-第2讲-大模型到底是什么?——拆解“参数、训练、推理”
笔记·学习·深度认知
兴通物联科技9 小时前
SMT PCB 微小 DataMatrix 码扫不动问题分析 兴通 XT8601B 600 万像素工业读码器落地实践
大数据·人工智能·单片机·嵌入式硬件·算法·计算机视觉
lzhdim10 小时前
12、JavaScript常见的内存泄露问题 - JavaScript学习系列文章
开发语言·前端·javascript·学习·ecmascript
那年窗外下的雪.11 小时前
AIDC 学习日志|第 15 天|EVPN 多归属故障收敛与撤销机制
网络·学习·php
月华路12 小时前
G1 GC 对数组与大对象(Humongous)的处理
java·jvm·算法