合并两个链表 --- 递归回溯算法练习二

目录

1. 分析题意

2. 分析算法原理

2.1. 递归思路:

 1. 挖掘子问题:

3. 编写代码

3.1. step one

3.2. step two

3.3. step three

3.1. 递归写法

4. 补充 --- 迭代写法

5. 总结


1. 分析题意

力扣上原题链接如下:

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

题意:将两个升序链表合成一个新的升序链表并返回其头指针。

注意:新链表的所有节点是原链表转移过来的,不可以自己new节点。

2. 分析算法原理

2.1. 递归思路:

一个问题如果可以用递归处理,那么首先我们需要挖掘出重复的子问题

该问题的目的:合并两个有序链表,并返回合并后的那个链表的头指针。

 1. 挖掘子问题:

因为是升序,那么我们找小,lt1 < lt2,那么我们将lt1这个节点摘下来,此时接下来的问题就是合并下面的这两个有序链表。

此时我们就发现,一个大问题,可以被分为重复的子问题。因此,此时的重复子问题就是:合并两个有序链表。既然可以挖掘出重复子问题,那么就可以利用递归处理。

3. 编写代码

3.1. step one

step one:重复子问题,该过程决定了函数头的设计。经过我们上面的分析,重复子问题就是合并两个有序链表。

// 递归函数头的设计:
Node* dfs(lt1,lt2);

3.2. step two

step two:只关心某一个子问题在做什么事情,这个过程决定了函数体的设计。

对于递归代码的编写,我们需要站在宏观的角度看待递归问题:我们一定要相信上面的dfs这个函数一定可以完成我们预期看到的结果:合并两个升序链表,并返回合并后的头指针。

// 某个子问题具体做的事情
(1): 比大小
// 当l1 < l2
(2): l1->next = dfs(l1->next,l2);
(3): return l1;
// 当l1 > l2
(2): l2->next = dfs(l1,l2->next);
(3): return l2;

3.3. step three

step three:当一个问题不可以在被分为相同子问题的时候,就是递归结束条件;这个过程决定了递归的出口;例如上面,当其中一个链表走到空了,那么返回另一个链表即可。

// 递归结束条件
if(!l1) return l2;
if(!l2) return l1;

3.4. 递归代码

根据上面的分析,我们就可以简单的写出我们的递归代码了:

class Solution {
public:
    // step one:
    ListNode* mergeTwoLists(ListNode* lt1, ListNode* lt2) {

        // step three:
        if(!lt1) return lt2;
        if(!lt2) return lt1;
        
        // step two:
        if(lt1->val < lt2->val)
        {
            lt1->next = mergeTwoLists(lt1->next,lt2);
            return lt1;
        }
        else
        {
            lt2->next = mergeTwoLists(lt1,lt2->next);
            return lt2;
        }
    }
};

4. 补充 --- 迭代写法

迭代写法,就是依次比较,得到小的哪一个节点,摘下来,当一个走到空,就结束循环,把另一个链表剩余的节点连接起来即可。迭代写法以前就实现过,在这里不细谈。

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        if(!list1)  return list2;
        if(!list2)  return list1;

        ListNode* newhead = nullptr;
        ListNode* newtail = nullptr;

        while(list1 && list2)
        {
            if(list1->val < list2->val)
            {
                if(newhead == nullptr)
                {
                    newhead = newtail = list1;
                }
                else
                {
                    newtail->next = list1;
                    newtail = list1;
                }
                list1 = list1->next;
            }
            else
            {
                if(newhead == nullptr)
                {
                    newhead = newtail = list2;
                }
                else
                {
                    newtail->next = list2;
                    newtail = list2;
                }
                list2 = list2->next;
            }
        }
        if(list1)
            newtail->next = list1;
        else
        
            newtail->next = list2;
         return newhead;
    }
};

5. 总结

循环(迭代)  和 递归:

递归的核心:需要挖掘重复子问题

循环:同样解决的是重复的问题

因此循环可以改递归,递归可以改循环。

但是一般情况下:递归展开图可以分为多分支和单分支

多分支 ---> 递归不好改循环

单分支 ---> 递归比较容易改循环(但有些特殊情况也非常麻烦)

递归的展开图就是对一棵树做深度优先遍历(DFS),其次,中序遍历只局限于二叉树中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/131467.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

密码学 - RSA签名算法

实验九 RSA签名算法- 一、实验目的 通过实验掌握GMP开源软件的用法&#xff0c;理解RSA数字签名算法&#xff0c;学会RSA数字签名算法程序设计&#xff0c;提高一般数字签名算法的设计能力。 二、实验要求 (1)基于GMP开源软件&#xff0c;实现RSA签名算法。 (2)要求有对应…

【LeetCode笔试题】88.合并两个有序数组

问题描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&#xff0c;合…

关灯游戏及扩展

7.8 图形界面应用案例——关灯游戏 题目&#xff1a; [案例]游戏初步——关灯游戏。 关灯游戏是很有意思的益智游戏&#xff0c;玩家通过单击关掉(或打开)一盏灯。如果关(掉&#xff08;或打开)一个电灯&#xff0c;其周围(上下左右)的电灯也会触及开关&#xff0c;成…

spring boot configuration annotation processor notconfigured解决方法

spring boot configuration annotation processor notconfigured解决方法 一、问题描述二、解决方法 一、问题描述 我在使用ConfigurationProperties注解的时候idea出现提示信息spring boot configuration annotation processor notconfigured&#xff0c;但是却不影响程序的运…

22款奔驰S400L升级原厂360全景影像 打破死角

本次星骏汇小许介绍的是22款奔驰S400L升级原厂360全景影像&#xff0c;上帝视角看清车辆周围环境&#xff0c;更轻松驾驶 升级360全景影像系统共有前后左右4个摄像头&#xff0c;分别在车头&#xff0c;车尾&#xff0c;以及两边反光镜下各一个&#xff0c;分别用来采集车头&a…

Springboot+vue的企业资产管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的企业资产管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的企业资产管理系统&#xff0c;采用M&#xff08;model&a…

如何更好的使用Copilot

Copilot从诞生到现在过去了挺长时间了&#xff0c;大家对Copilot的评价算是褒贬不一吧。有些人觉得Copilot高效且神奇&#xff0c;可以对自己的工作大大提效&#xff1b;有些觉得也就那样&#xff0c;为什么要花那么多钱做这个事情&#xff0c;钱它不香吗&#xff1f; 从最开始…

地推网推必备app拉新平台 又升级啦 一手官签渠道

今天地推网推必备app拉新平台 ”聚量推客“ 又升级啦 一手邀请码 000000 今天升级了什么呢&#xff1f; 针对地推和网推作业人员升级了团队管理和做单excel导出功能&#xff0c;更好得查看自己和团队的作业情况&#xff0c;这个功能是地推和网推的一个必备功能

CodeWhisperer 史上最强大的 AI 编程助手!!

最近用了一个叫 CodeWhisperer 的插件&#xff0c;这个软件对于来说开发人员&#xff0c;插件有好多实用的功能&#xff0c;能有效减少我们的重复性工作&#xff0c;让编码更高效&#xff0c;代码质量也提升了很多。 CodeWhisperer 简介 CodeWhisperer 是亚⻢逊出品的一款基于…

uniapp中在组件中使用被遮挡或层级显示问题

uniapp中在组件中使用或croll-view标签内使用uni-popup在真机环境下会被scroll-view兄弟元素遮挡&#xff0c;在开发环境下和安卓系统中可以正常显示&#xff0c;但在ios中出现了问题 看了许多文章都没有找到问题的原因&#xff0c;最后看到这一个文章http://t.csdnimg.cn/pvQ…

Clickhouse学习笔记(4)—— Clickhouse SQL

insert insert操作和mysql一致 标准语法&#xff1a;insert into [table_name] values(…),(….)从表到表的插入&#xff1a;insert into [table_name] select a,b,c from [table_name_2] update 和 delete ClickHouse 提供了 Delete 和 Update 的能力&#xff0c;这类操作…

AI 引擎系列 5 - 以 AI 引擎模型为目标运行 AI 引擎编译器(2022.1 更新)

AI 引擎系列 5 - 以 AI 引擎模型为目标运行 AI 引擎编译器&#xff08;2022.1 更新&#xff09; 简介 在先前的 AI 引擎系列博文中&#xff0c;我们以 x86 模型为目标运行了 AI 引擎编译器&#xff0c;并运行了 X86 仿真器来验证 AI 引擎应用的功能模型。在本文中&#xff0c;…

嵌入式CTS测试

1.概述 CTS是一套开源测试套件&#xff0c;可以实现对OpenGL、ES、OpenCL、Vulkan的兼容性测试。OpenGL ES CTS的测试集&#xff0c;其测试用例涵盖了各种OpenGL ES 的功能和特性。这些功能包括着色器编译和链接、图元绘制、纹理操作、帧缓冲操作、深度测试、模板测试以及其他一…

直播间自动发言机器人的运行分享,与开发需要到的技术分析

先来看实操成果&#xff0c;↑↑需要的同学可看我名字↖↖↖↖↖&#xff0c;或评论888无偿分享 一、引言 随着人工智能技术的不断发展&#xff0c;自动发言机器人已经成为了当今社交媒体领域的重要组成部分。它们能够自动化地发布内容、回复用户评论和消息&#xff0c;大大提高…

【Linux】--进程信号

信号 1.信号入门 程序员设计进程的时候&#xff0c;早就已经设计了对信号的识别能力&#xff01;&#xff01;&#xff01;&#xff01;进程在没有收到信号的时候&#xff0c;其实它早就已经知道一个信号该怎么处理了&#xff01;因为信号可能随时会产生&#xff0c;所有在信…

类与对象(2)

✨前言✨ &#x1f4d8; 博客主页&#xff1a;to Keep博客主页 &#x1f646;欢迎关注&#xff0c;&#x1f44d;点赞&#xff0c;&#x1f4dd;留言评论 ⏳首发时间&#xff1a;2023年11月11日 &#x1f4e8; 博主码云地址&#xff1a;博主码云地址 &#x1f4d5;参考书籍&…

牛客、赛码网OJ调试(全)

现在无论开发还是测试&#xff0c;面试的时候都需要考察代码能力。 从测试的职业发展来看&#xff0c;现在市场上对于纯功能测试的需求很少&#xff0c;招聘方均要求面试者一方面具备测试基础能力&#xff0c;也要求有点代码能力。 对于测试来说&#xff0c;除了测试开发&#…

程序员的那些坏习惯!来看看你有几个?

一、前言 写了20多年代码&#xff0c;我见过不下于4位数的程序员&#xff0c;我觉得程序员的能力水平可以分为4个阶段&#xff1a;线性级、逻辑级、架构级和工程级。 同样的在这些人当中&#xff0c;我也发现了8个程序员最常见的陋习&#xff0c;基本上可以覆盖90%的人&#…

自动驾驶算法(十):多项式轨迹与Minimun Snap闭式求解原理及代码讲解

目录 1 多项式轨迹与Minimun Snap闭式求解原理 2 代码解析 1 多项式轨迹与Minimun Snap闭式求解原理 我们上次说的Minimun Snap&#xff0c;其实我们就在求一个二次函数的最优解&#xff1a; 也就是优化函数在约束下的最小值。 但这是一个渐进最优解而不是解析最优解&#xf…

云栖大会丨桑文锋:打造云原生数字化客户经营引擎

近日&#xff0c;2023 云栖大会在杭州举办。今年云栖大会回归了 2015 的主题&#xff1a;「计算&#xff0c;为了无法计算的价值」。神策数据创始人 & CEO 桑文锋受邀出席「生态产品与伙伴赋能」技术主题&#xff0c;并以「打造云原生数字化客户经营引擎」为主题进行演讲。…