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

news2025/1/11 12:56:35

目录

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),其次,中序遍历只局限于二叉树中。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu16.04 交叉编译 mbedtls

在为客户交叉编译项目时需要依赖 mbedtls&#xff0c; 客户的机器是 arm64 的 ubuntu 16.04&#xff0c; 交叉编译过程中遇到几个问题。 首先&#xff0c; mbedtls 需要依赖 python, 在 cmake 的过程中&#xff0c; 如果不是使用系统默认的 cmake 可能会导致&#xff0c;mbedt…

6.4翻转二叉树(LC226—送分题,前序遍历)

算法&#xff1a; 第一想法是用昨天的层序遍历&#xff0c;把每一层level用切片反转。但是这样时间复杂度很高。 其实只要在遍历的过程中去翻转每一个节点的左右孩子就可以达到整体翻转的效果。 这道题目使用前序遍历和后序遍历都可以&#xff0c;唯独中序遍历不方便&#x…

赛氪中西部外语翻译大赛入榜2023国内翻译赛事发展评估报告

中西部外语翻译大赛入选中国外文局CATTI项目管理中心和中国外文界平台联合发布《2023国内翻译赛事发展评估报告》 近日&#xff0c;中国外文局CATTI项目管理中心和中国外文界平台联合发布了《2023国内翻译赛事发展评估报告》&#xff0c;报告对国内主流外语翻译赛事进行了问卷调…

Centos8安装出错问题

科普介绍&#xff1a; CentOS 8 是一个基于 Linux 的操作系统&#xff0c;是 Red Hat Enterprise Linux &#xff08;RHEL&#xff09;的免费和开源版本。它提供了稳定、安全和可靠的基础设施&#xff0c;适用于服务器和桌面环境。CentOS 8 是 CentOS 系列中最新的版本&#x…

Nginx(五)

负载均衡 官网文档 Using nginx as HTTP load balancer nginx中实现反向代理的方式 HTTP&#xff1a;通过nginx配置反向代理到后端服务器&#xff0c;nginx将接收到的HTTP请求转发给后端服务器。使用 proxy_pass 命令 HTTPS&#xff1a;通过nginx配置反向代理到后端服务器&…

Amazon Aurora MySQL 与 Amazon Redshift 的 Zero ETL 集成已全面可用,一起轻松上手!

“数据是应用、流程和商业决策的核心。” 亚马逊云科技数据库、 数据分析和机器学习全球副总裁 Swami Sivasubramanian 如今&#xff0c;客户常用的数据传输模式是建立从 Amazon Aurora 到 Amazon Redshift 的数据管道。这些解决方案能够帮助客户获得新的见解&#xff0c;进而…

【狂神说Java】linux详解

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;狂神说Java &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#xff0c;你不上台&#xff0c;永远…

Llama2通过llama.cpp模型量化 WindowsLinux本地部署

Llama2通过llama.cpp模型量化 Windows&Linux本地部署 什么是LLaMA 1 and 2 LLaMA&#xff0c;它是一组基础语言模型&#xff0c;参数范围从7B到65B。在数万亿的tokens上训练的模型&#xff0c;并表明可以专门使用公开可用的数据集来训练最先进的模型&#xff0c;而无需求…

编码规范集合

文章目录 前言命名规范项目命名目录命名文件命名命名严谨性 HTML 书写规范结构、样式、行为分离缩进文件编码语义化IE 兼容模式viewport为移动端设备优化&#xff0c;设置可见区域的宽度和初始缩放比例iOS 图标favicon&#xff08;网站图标&#xff0c;移动端默认可用于添加到桌…

微信小程序前端开发

目录 前言&#xff1a; 1. 框架选择和项目搭建 2. 小程序页面开发 3. 数据通信和接口调用 4. 性能优化和调试技巧 5. 小程序发布和上线 前言&#xff1a; 当谈到微信小程序前端开发时&#xff0c;我们指的是使用微信小程序框架进行开发的一种方式。在本文中&#xff0c;我…

100+ Windows运行命令大全,装B高手必备

操作电脑关闭、重启、注销、休眠的命令细则: 用法: shutdown [/i | /l | /s | /sg | /r | /g | /a | /p | /h | /e | /o] [/hybrid] [/soft] [/fw] [/f] [/m \\computer][/t xxx][/d [p|u:]xx:yy [/c "comment"]] 没有参数 显示帮助。这与键入 /? 是一样的。…

第七章 :Spring Boot web开发常用注解(二)

第七章 :Spring Boot web开发常用注解(二) 前言 本章节知识重点:作者结合自身开发经验,以及觉察到的一个现象:Springboot注解全面理解和掌握的并不多,对注解进行了全面总结,共分两个章节,可以作为web开发工程师注解参考手册,SpringBoot常用注解大全,一目了然!。本…

python机器学习——随机森林

随机森林 随机森林&#xff08;Random Forest&#xff09;是一种集成学习方法&#xff0c;它通过构建多个决策树并结合它们的预测结果来进行分类或回归。 算法原理&#xff1a; 决策树&#xff08;Decision Tree&#xff09;: 随机森林由多个决策树组成。决策树是一种基于树…

增强地理热图:Highcharts Maps v11.2.0 Crack

Highcharts Maps v11.2.0 添加了对地理热图插值的支持&#xff0c;允许您在类似温度图的图表的已知数据点之间添加估计值。 Highcharts Maps 提供了一种符合标准的方法&#xff0c;用于在基于 Web 的项目中创建逻辑示意图。它扩展了用户友好的 Highcharts JavaScript API&#…

JTS: 18 DistanceToPoint 最近距离计算

这里写目录标题 版本代码 版本 org.locationtech.jts:jts-core:1.19.0 链接: github 代码 import org.locationtech.jts.algorithm.distance.DistanceToPoint; import org.locationtech.jts.algorithm.distance.PointPairDistance; import org.locationtech.jts.geom.Coordin…

【Qt-23】ui界面设计-ToolBar

1、ToolBar 右击主窗体添加工具栏 新建动作&#xff0c;可设置图标&#xff0c;图标有本地文件和资源两种方式。 修改toolButtonStyle的属性&#xff0c;可设置图标与汉字显示的方式。 页面跳转&#xff1a; connect(ui->action, SIGNAL(triggered()), this, SLOT(openWid…

抖音直播矩阵玩法,直播矩阵引流项目,每日精准引流500左右

今天我再分享一个专注于纯直播带货的玩法&#xff0c;这个案例不论是导流还是直播模式&#xff0c;都值得我们深入关注。某音直播矩阵玩法&#xff0c;每日精准引流500 这种直播方式通常会邀请两位模特&#xff0c;一个展示产品&#xff0c;一个递交产品&#xff0c;无需过多的…

小程序开发——小程序页面的配置与生命周期

目录 1.小程序的页面配置 2.页面的生命周期 3.页面跳转 4.页面间的参数传递 5.新闻客户端案例讲解 6.小结 1.小程序的页面配置 页面的配置设置app.json中的window配置项的内容&#xff08;页面中配置项会覆盖app.json的window中相同的配置项&#xff09;&#xff0c;其属…

【狂神说Java】SpringCloud-Netflix

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;狂神说Java &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#xff0c;你不上台&#xff0c;永远…

利用梯度上升可视化卷积核:基于torch实现

利用梯度上升可视化卷积核 文章目录 前言基本原理版本和包结果展示 简单绘图修改源码绘图方法一 方法二&#xff08;推荐&#xff09; 报错解决总结 前言 基于梯度上升的可视化是一种常用的技术&#xff0c;用于理解卷积神经网络&#xff08;CNN&#xff09;中的卷积核是如何对…