LeetCode每日一题Day5——21. 合并两个有序链表

博主:命运之光 

🦄专栏:算法修炼之练气篇(C\C++版)

🍓专栏:算法修炼之筑基篇(C\C++版)

🐳专栏:算法修炼之练气篇(Python版)

博主的其他文章:点击进入博主的主页 

前言:欢迎来到这个LeetCode每日算法题专栏!

🌊无论你是编程新手还是有一定经验的开发者,掌握算法和数据结构都是成功的关键。在这个专栏里,我将每天为你分享一道算法题,并提供简单易懂的解析和讲解。

☀️通过每日挑战,你将逐渐培养解决问题的思维方式,掌握重要的编程技巧。无论是面试准备还是日常编码,这些知识都将对你大有裨益。

🎉让我们一起开始这段充满乐趣和成长的学习之旅吧!希望你能从中受益,开拓编程的新视野!

目录

21. 合并两个有序链表

正确答案

方法一:暴力破解

提交记录

详细解析该题代码(方法一:暴力破解)

方法二:递归法解题

提交记录

详细解析该题代码(方法二:递归法解题)

结语


21. 合并两个有序链表

正确答案

方法一:暴力破解

/*** 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* l1, ListNode* l2) {ListNode dummy=ListNode(-1);ListNode *prev=&dummy;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;}prev->next=l1==nullptr?l2:l1;return dummy.next;}
};

提交记录

详细解析该题代码(方法一:暴力破解)

这段代码是一个用于合并两个升序链表的C++函数,其中使用了单链表的数据结构。现在,我将逐行解析代码的功能:

  1. 定义了一个单链表的数据结构 ListNode,每个节点包含一个整数值 val 和一个指向下一个节点的指针 next。该数据结构提供了三个构造函数:
    • ListNode():无参构造函数,初始化 val 为0,next 为nullptr。
    • ListNode(int x):带参构造函数,初始化 val 为给定的整数x,next 为nullptr。
    • ListNode(int x, ListNode *next):带参构造函数,初始化 val 为给定的整数x,next 为指向给定节点的指针。
  1. 接下来是一个C++类 Solution 的定义。该类中有一个公共成员函数 mergeTwoLists,它用于合并两个升序链表。该函数接受两个指向链表头节点的指针 l1l2,并返回一个指向合并后链表头节点的指针。
  2. mergeTwoLists 函数中:
    • 创建了一个名为 dummyListNode 对象,并初始化其值为-1。这个 dummy 节点在合并过程中起到了哨兵节点的作用,它不包含实际数据,只是用来简化代码逻辑。
    • 创建一个指向 dummy 节点的指针 prev,用于跟踪合并后链表的末尾节点。
  1. 使用 while 循环进行链表的合并,循环条件是 l1l2 都不为nullptr(即还有节点需要合并)。
    • 在循环体中,比较 l1->vall2->val 的大小,如果 l1 的值小于 l2,则将 l1 添加到合并后链表的末尾,并将 l1 指针移动到下一个节点;否则,将 l2 添加到合并后链表的末尾,并将 l2 指针移动到下一个节点。
    • 然后,将 prev 指针移动到合并后链表的末尾。
  1. 当循环结束后,有可能 l1l2 中还有剩余节点未合并,此时需要将剩余的部分直接添加到合并后链表的末尾。这里使用了三目运算符 l1==nullptr?l2:l1 来确定应该将哪个链表的剩余部分添加到末尾。
  2. 最后,返回 dummy.next,即合并后链表的头节点的指针。由于 dummy 是一个临时节点,实际的合并后链表从 dummy.next 开始。

总体来说,这段代码通过迭代遍历两个升序链表,根据节点值的大小将节点逐个合并,并返回合并后的链表头节点的指针。合并后的链表仍然保持升序。

方法二:递归法解题

/*** 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* 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;}}
};

提交记录

详细解析该题代码(方法二:递归法解题)

除了迭代法外,还有递归法可以解决合并两个升序链表的问题。我将为你介绍递归法的解题思路和代码示例。

递归法的思路是基于合并两个升序链表的子问题。假设我们已经知道如何合并两个以 l1l2 为头节点的升序链表,我们可以将问题转化为合并以 l1->nextl2 为头节点的升序链表,并将结果连接到 l1 上。这样,问题规模不断缩小,最终合并两个链表的问题将转化为合并两个小一些的链表的问题,直到其中一个链表为空。

下面是用递归法解决问题的代码示例:

/*** 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* 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;}}
};

在递归函数 mergeTwoLists 中,我们首先处理边界情况,即如果其中一个链表为空,直接返回另一个链表。然后,我们比较 l1->vall2->val 的大小,如果 l1 的值小于 l2,则将 l1 的下一个节点与合并后的链表连接,并返回 l1;否则,将 l2 的下一个节点与合并后的链表连接,并返回 l2

递归法的思路较为简洁,但需要注意对递归深度的控制,防止出现栈溢出的情况。在实际应用中,可能需要对递归深度进行限制或使用迭代法来处理大规模的链表。

结语

再接再厉,继续加油!


本章的内容就到这里了,觉得对你有帮助的话就支持一下博主把~

🌌点击下方个人名片,交流会更方便哦~
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓

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

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

相关文章

3ds Max如何进行合成的反射光泽通道渲染

推荐&#xff1a; NSDT场景编辑器 助你快速搭建可二次开发的3D应用场景 1. 准备场景 步骤 1 打开 3ds Max。smart_phone.max打开已 随教程提供。 打开 3ds Max 步骤 2 按 M 打开材质编辑器。选择空材料 槽。单击漫射通道。它将打开材质/贴图浏览器窗口。选择位图&#xff0…

ffmpeg安装

简介 FFmpeg是一个开源的音视频处理库&#xff0c;它提供了一系列的工具和API&#xff0c;可以用于处理音视频文件。你可以使用FFmpeg的命令行工具来执行各种音视频处理操作&#xff0c;比如转码、剪辑、合并等。FFmpeg的命令格式通常是&#xff1a;ffmpeg [全局选项] {[输入文…

【MFC】01.MFC框架-笔记

基本概念 MFC Microsoft Fundation class 微软基础类库 框架 基于Win32 SDK进行的封装 属性&#xff1a;缓解库关闭 属性->C/C/代码生成/运行库/MTD 属性->常规->MFC的使用&#xff1a;在静态库中使用MFC&#xff0c;默认是使用的共享DLL&#xff0c;运行时库 SD…

Python | threading

Python | threading 1. 简介 Python的threading模块是用于创建和管理线程的标准库。线程是在同一进程中执行的多个执行路径&#xff0c;使程序可以同时执行多个任务。 threading模块提供了Thread类&#xff0c;通过创建Thread对象&#xff0c;可以轻松地在Python中启动和管理…

Hum Brain Mapp:用于功能连接体指纹识别和认知状态解码的高精度机器学习技术

摘要 人脑是一个复杂的网络&#xff0c;由功能和解剖上相互连接的脑区组成。越来越多的研究表明&#xff0c;对脑网络的实证估计可能有助于发现疾病和认知状态的生物标志物。然而&#xff0c;实现这一目标的先决条件是脑网络还必须是个体的可靠标记。在这里&#xff0c;本研究…

Docker入门之运行Nginx案例

运行镜像 如果你直接安装会比较慢, 建议参照附录内容配置镜像之后再执行 # 执行命令过程一&#xff1a;下载容器镜像 docker run -d nginx:latest 命令解释 docker run 启动一个容器 -d 把容器镜像中需要执行的命令以daemon&#xff08;守护进程&#xff09;的方式运行 nginx…

性能优化-react路由懒加载和组件懒加载

背景 随着项目越来越大&#xff0c;打包后的包体积也越来越大&#xff0c;严重影响了首屏加载速度&#xff0c;需要对路由和组件做懒加载处理 主要用到了react中的lazy和Suspense。 废话不多说&#xff0c;直接上干货 路由懒加载 核心代码 import React, { lazy, Suspens…

GPS/北斗RTK差分定位系统的原理以及应用领域

导语&#xff1a;现代定位技术在国内外的发展与应用越来越广泛&#xff0c;其中GPS和北斗是两大被广泛使用的全球卫星定位系统。本文将介绍GPS/北斗RTK差分定位系统的原理以及其在各个领域的应用。 一、GPS/北斗RTK差分定位系统的原理 GPS/北斗RTK差分定位系统&#xff0c;即全…

【TypeScript】安装的坑!

TypeScript安装 安装TypeScript安装时候可能报错这样开头的数据&#xff08;无法枚举容器中的对象&#xff09;——原因&#xff1a;没权限先解决没权限的问题如果发现无法修改-高级-修改继续安装想使用tsc-发现&#xff0c;tsc不能用解决方法&#xff1a;配置环境变量最后的最…

便捷省心的手机直播影视工具,畅享轻松电视娱乐时光

便捷省心的手机直播影视工具&#xff0c;畅享轻松电视娱乐时光 在快节奏的现代生活中&#xff0c;我们常常渴望能够以简单、省心的方式消遣自己&#xff0c;享受高品质的电视娱乐。幸运的是&#xff0c;随着技术的进步&#xff0c;便捷省心的手机直播影视工具应运而生。这些工…

Adaptive autosar 都有哪些模块?各有什么功能?

Adaptive autosar是一种用于高性能计算ECU的软件平台,它支持自适应应用程序的开发和运行。它由两部分组成:基础(Foundation)和服务(Service)。基础包括了操作系统接口、执行管理、网络管理、识别访问管理、加密、更新和配置管理等功能。服务包括了通信管理、RESTful、时间…

【目标检测论文解读复现NO.33】改进YOLOv5的新能源电池集流盘缺陷检测方法

前言 此前出了目标改进算法专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读最新目标检测算法论文&#xff0c…

Kubernetes v1.20 二进制部署

架构 k8s集群master01&#xff1a;192.168.80.101 kube-apiserver kube-controller-manager kube-scheduler etcd k8s集群master02&#xff1a;192.168.80.102 k8s集群node01&#xff1a;192.168.80.103 kubelet kube-proxy docker k8s集群node02&#xff1a;192.168.80…

Vue3文字实现左右和上下滚动

可自定义设置以下属性&#xff1a; 滚动文字数组&#xff08;sliderText&#xff09;&#xff0c;类型&#xff1a;Array<{title: string, link?: string}>&#xff0c;必传&#xff0c;默认[] 滚动区域宽度&#xff08;width&#xff09;&#xff0c;类型&#xff1a…

git拉取代码时出现Filename too long错误Git处理长路径

背景 git拉取代码时出现Filename too long错误 现象 如下&#xff1a; $ git checkout . error: unable to create file boot-starters/permission-access-security-service-boot-starter/src/main/java/cn/gzs***/basic/system/platform/starter/permission/access/resourc…

后端整理(MySql)

1 事务 1.1 事务ACID原则 原子性&#xff08;Atomicity&#xff09; 事务的原子性指的是事务的操作&#xff0c;要么全部成功&#xff0c;要么全部失败回滚 一致性&#xff08;Consistency&#xff09; 事务的一致性是指事务必须使数据库从一个一致状态转变成另一个一致性…

机器学习05-数据准备(利用 scikit-learn基于Pima Indian数据集作数据预处理)

机器学习的数据准备是指在将数据用于机器学习算法之前&#xff0c;对原始数据进行预处理、清洗和转换的过程。数据准备是机器学习中非常重要的一步&#xff0c;它直接影响了模型的性能和预测结果的准确性 以下是机器学习数据准备的一些常见步骤&#xff1a; 数据收集&#xff…

使用kubeadm快速部署一个k8s集群

Kubernetes概述 使用kubeadm快速部署一个k8s集群 Kubernetes高可用集群二进制部署&#xff08;一&#xff09;主机准备和负载均衡器安装 Kubernetes高可用集群二进制部署&#xff08;二&#xff09;ETCD集群部署 Kubernetes高可用集群二进制部署&#xff08;三&#xff09;部署…

JVM之垃圾回收器

1.如何判断对象可以回收 1.1 引用计数法 什么是引用计数器法 在对象中添加一个引用计数器&#xff0c;每当有一个地方引用它时&#xff0c;计数器值就加一&#xff1b;当引用失效时&#xff0c;计数器值就减一&#xff1b;任何时刻计数器为零的对象就是不可能再被使用的。 …

【C语言学习】整数范围、整数越界、无符号数

1.整数范围 对于一个字节&#xff08;8位&#xff09;&#xff0c;可以表达的范围是00000000 ~ 11111111 其中00000000 ——> 0 11111111 ~ 10000000 ——> -1 ~ -128&#xff08;从大到小&#xff09; 00000001 ~ 01111111 ——> 1~127&#xff08;从小到大&#xff…