【刷题之路】LeetCode 21. 合并两个有序链表

news2024/11/16 23:46:06

【刷题之路】LeetCode 21. 合并两个有序链表

  • 1、题目描述
  • 二、解题
    • 1、方法1——直接合并
      • 1.1、思路分析
      • 1.2、代码实现
    • 2、方法2——递归
      • 2.1、思路分析
      • 2.2、代码实现

1、题目描述

原题连接: 21. 合并两个有序链表
题目描述:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例 1:

在这里插入图片描述
输入: l1 = [1,2,4], l2 = [1,3,4]
输出: [1,1,2,3,4,4]

示例 2:

输入: l1 = [], l2 = []
输出: []

示例 3:

输入: l1 = [], l2 = [0]
输出: [0]

提示:
两个链表的节点数目范围是 [0, 50]
-100 <= Node.val <= 100
l1 和 l2 均按 非递减顺序 排列

二、解题

1、方法1——直接合并

1.1、思路分析

直接合并的思路就是使用两个指针分别遍历两个链表,每次都比较两个指针所指向的节点的值的大小,每次优先将值较小的节点尾插到一个新的链表之中:
在这里插入图片描述
而为了方便新链表的尾插,我们还需要一个tail指针来记录新链表的尾节点:
在这里插入图片描述
只要有其中一条链表遍历完毕,我们就可以跳出循环,然后我们需要判断还有哪一条链表为遍历完,然后直接将未遍历完的链表连接到tail的后面即可,例如:
在这里插入图片描述
这时候我们就直接将tail的next指向cur1即可。

1.2、代码实现

有了以上思路,那我们写起代码来也就水到渠成了:

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
    // 如果其中一个链表为空,则返回另一个即可
    if (NULL == list1) {
        return list2;
    } else if (NULL == list2) {
        return list1;
    }
    struct ListNode *head = NULL;
    struct ListNode *tail = NULL;
    while (list1 && list2) {
        if (list1->val < list2->val) {
            if (NULL == head) {
                head = list1;
                tail = list1;
            } else {
                tail->next = list1;
                tail = tail->next;
            }
            list1 = list1->next;
        } else {
            if (NULL == head) {
                head = list2;
                tail = list2;
            } else {
                tail->next = list2;
                tail = tail->next;
            }
            list2 = list2->next;
        }
    }
    // 判断是否还有链表未连接完
    if (list1) {
        tail->next = list1;
    } else if (list2) {
        tail->next = list2;
    }
    return head;
}

时间复杂度:O(m+n),其中m和n分别是两条链表的长度,最坏情况下我们需要将两条链表全都遍历一遍。
空间复杂度:O(1),我们只需要用到常数级的额外空间。

2、方法2——递归

2.1、思路分析

其实从上面的解法中我们也能得到启发想出一个大事化小的解法,因为我们每次的遍历只需要选出一个较小的节点,然后尾插到新链表之中。
所以我们可以将思路转化为,每次调用只需要选出较小的节点然后让较小的节点连接上后面合并后的链表即可,而后面的链表的合并也是用同样的递归方式来完成。
即:
在这里插入图片描述
当其中一条链表为空时,递归就可以停止。

2.2、代码实现

有了以上思路,那我们写起代码来也就水到渠成了:

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
    if (NULL == list1) {
        return list2;
    } else if (NULL == list2) {
        return list1;
    } else if (list1->val < list2->val) {
        list1->next = mergeTwoLists(list1->next, list2);
        return list1;
    } else {
        list2->next = mergeTwoLists(list1, list2->next);
        return list2;
    }
}

时间复杂度:O(m+n),其中m和n分别为两个链表的长度。
空间复杂度:O(m+n),m和n分别为两个链表的长度,空间复杂度递归调用的层数,最坏情况下,对于两个链表的每个节点我们都要调用一次,因此空间复杂度为O(m+n)。

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

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

相关文章

Camtasia Studio2023Mac最新电脑版屏幕录像软件

Camtasia Studio2023提供了强大的屏幕录像、视频的剪辑和编辑、视频菜单制作、视频剧场和视频播放功能等。它能在任何颜色模式下轻松地记录屏幕动作&#xff0c;包括影像、音效、鼠标移动的轨迹&#xff0c;解说声音等等&#xff0c;另外&#xff0c;它还具有及时播放和编辑压缩…

数字化转型导师坚鹏:美的集团数字化转型案例研究

美的集团数字化转型案例研究 课程背景&#xff1a; 很多企业存在以下问题&#xff1a; 不清楚企业数字化转型能否成功&#xff1f; 不知道其它企业数字化转型的实际做法&#xff1f; 不知道其它企业的数字化转型战略是如何演变的&#xff1f; 课程特色&#xff1a; 用…

汽车架构-工作流程 以及相关协议解读

全车架构&#xff08;E/E&#xff09; 车载测试阶段&#xff1a; 台架测试 HIL测试&#xff08;硬件在环测试&#xff09; ADAS智能辅助驾驶测试 OTA测试&#xff08;远程升级测试&#xff09; 测试工具&#xff1a; Can协议工具&#xff1a;Canoe Pcan Zcanpro 辅助工具…

【Stable Diffusion】ControlNet基本教程(三)

接上篇【Stable Diffusion】ControlNet基本教程&#xff08;二&#xff09;&#xff0c;本篇再介绍两个ControlNet常见的基本用法&#xff0c;更多用法欢迎关注博主&#xff0c;博主还会更新更多有趣的内容。 3.3更换物体皮肤 有时&#xff0c;我们不想改变物体的轮廓&#xff…

毫米波雷达系列 | 传统CFAR检测(均值类)

毫米波雷达系列 | 传统CFAR检测&#xff08;均值类&#xff09; 文章目录 毫米波雷达系列 | 传统CFAR检测&#xff08;均值类&#xff09;1.CA-CFAR算法2.SO-CFRA算法3.GO-CFAR算法4.仿真对比 CFAR检测器主要用于检测背景杂波环境中的雷达目标&#xff0c;常见的均值类CFAR检测…

数据结构之队列的详解

文章目录 一.什么是队列二.队列的使用2.1 队列的基本操作2.2 队列的基本使用 三.队列的模拟实现3.1 数组实现队列3.2 链表实现队列 四.队列的应用4.1 设计循环队列4.2 设计双端队列4.3 队列实现栈4.4 栈实现队列 五.总结 一.什么是队列 队列是一种先入先出(FIFO)的线性表数据结…

点评项目导入

文章目录 开篇导读项目地址导入SQL项目架构介绍后端项目导入前端项目导入 开篇导读 实战篇我们要学习以下内容 短信登录 这一块我们会使用redis共享session来实现 商户查询缓存 通过本章节&#xff0c;我们会理解缓存击穿&#xff0c;缓存穿透&#xff0c;缓存雪崩等问题&…

力扣刷题Day12

239. 滑动窗口最大值 (此题逻辑真心牛皮&#xff09; 做此题之前&#xff0c;首先明确此题的目的。我最开始没搞明白此题目的&#xff0c;看代码的时候卡死。 copy他人代码&#xff1a; from collections import dequeclass MyQueue: #单调队列&#xff08;从大到小def __ini…

6.S081——陷阱部分(一文读懂Xv6系统调用)——xv6源码完全解析系列(5)

0.briefly speaking 这篇博客将要开始尝试阅读和研究与Xv6陷阱机制相关的代码&#xff0c;主要有以下文件&#xff0c;最重要的是结合Xv6 book将Xv6处理陷阱的相关逻辑和流程弄透。在Xv6的语境中所谓陷阱的触发有以下三种情况&#xff1a; 系统调用严重错误&#xff08;比如除…

windows守护进程工具--nssm使用

一、nssm简介 nssm是一个服务封装程序&#xff0c;它可以将普通exe程序封装成服务&#xff0c;实现开机自启动&#xff0c;同类型的工具还有微软自己的srvany&#xff0c;不过nssm更加简单易用&#xff0c;并且功能强大。 它的特点如下&#xff1a; 支持普通exe程序(控制台程序…

每天看一个fortran文件(7)之寻找cesm边界层高度计算代码

自从我把我的代码移到了单独的F90 中&#xff0c;从tphysac.F90中调用后。我发现有很多的变量我没办法调用了&#xff0c;特别是边界层中原先已经算好的变量&#xff0c;比如说我想调用原来模式中的pblh,但是那是在vertical diffusion.F90中计算的&#xff0c;在tphysac中根本调…

基于springcloud实现的医院信息系统

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 医疗信息就诊系统&#xff0c;系统主要功能按照数据流量、流向及处理过程分为临床诊疗、药品管理、财务管理、患者管理。诊疗活动由各工作站配合完成&#xff0c;并将临床信息进行整理、处理、汇总、统计、分析等。本系统包括以…

以前以为去流量大的部门是好事,能学技术,现在才知道,流量大的部门狗都不去!晚上9点才下班,一天到晚都是监控告警!...

流量大的部门好&#xff0c;还是流量小的部门好&#xff1f; 一位网友说&#xff0c;工作以前以为去流量大的部门是好事&#xff0c;能学技术&#xff1b;工作后才知道&#xff0c;流量大的部门和组&#xff0c;狗都不去&#xff01;待在流量大的组&#xff0c;晚上9点起步才下…

p71 内网安全-域横向网络传输应用层隧道技术

数据来源 必备知识点&#xff1a; 1、代理和隧道技术区别? 代理&#xff1a;只是解决网络的访问问题&#xff08;如&#xff1a;有些内网访问不到&#xff0c;可以用代理实现&#xff09; 隧道&#xff1a;隧道不仅是解决网络的通信问题&#xff0c;更大的作用是绕过过滤&…

菜刀、蚁剑以及冰蝎三款Webshell管理工具简介

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是菜刀、蚁剑以及冰蝎三款Webshell管理工具简介。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&…

YOLO(你只需看一眼)技术通讲(基于论文与开源代码)

YOLO通讲 前言YOLO v1论文及项目地址介绍模型架构统一检测边界框的置信度类置信度 网络设计训练 模型局限总结 YOLO v2模型改进正则化批处理使用高分辨率分类器卷积化锚盒维度聚类 前言 YOLO作为现在目标检测技术中较为基础且流行的技术之一。本文将以开源者的论文与模型为基础…

UE5实现物体高亮描边效果(含UE相关源码浅析)

文章目录 1.实现目标2.实现过程2.1 UE Editor中相关源码2.2 深度值描边2.3 半透明材质处理2.4 遮挡处理2.5 视口边缘处理3.参考资料1.实现目标 在UE5中实现物体边缘高亮效果,且在被遮挡时在边缘显示不同的颜色,当到达视口边缘时,也会将该物体与视口边缘相交的部分高亮。 2.…

纯比例控制为什么会存在稳态误差,用纯增益系统举例

warning: 本文仅为个人思考&#xff0c;非常不严谨甚至可能会出现严重错误&#xff0c;请读者仔细甄别&#xff0c;若本文真的存在严重错误&#xff0c;恳请评论区纠正&#xff0c;我看到将会考虑修改或者删除文章 纯比例控制存在稳态误差是由其本质&#xff08;控制逻辑&#…

从FPGA说起的深度学习(九)- 优化最终章

这是新的系列教程&#xff0c;在本教程中&#xff0c;我们将介绍使用 FPGA 实现深度学习的技术&#xff0c;深度学习是近年来人工智能领域的热门话题。 在本教程中&#xff0c;旨在加深对深度学习和 FPGA 的理解。 用 C/C 编写深度学习推理代码高级综合 (HLS) 将 C/C 代码转换为…

【在线OJ项目】核心技术之用户提交代码的编译运行

目录 一、认识Java进程编程 二、在线OJ核心思路 三、封装进程的执行 四、封装文件读写 五、封装用户提交代码的编译运行 一、认识Java进程编程 在之前的文章里提到了Java进程编程的相关API【JavaEE】Java中进程编程_1373i的博客-CSDN博客https://blog.csdn.net/qq_6190341…