⭐每天一道leetcode:21.合并两个有序链表(简单;双指针)

news2024/11/15 8:32:49

⭐今日份题目

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例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

  • l1l2 均按 非递减顺序 排列

⭐题目思路

这里还是提取一下题目的特征点:

  • 合并

  • 链表

  • 升序

该题目我的解题思路是双指针。我们先定义一个结果链表来存储结果,然后设置双指针:

  • 指针1指向链表1的开头,指针2指向链表2的开头;

  • 然后判断大小,小的一方加入到结果链表中,并且后移;

  • 直至遍历完两个链表中的所有节点

这道题目的不同之处在于,传给函数的就已经是链表的初始位置了,所以不需要额外设置指针,直接用list1和list2即可。

此外需要注意的点是:

  • 每次后移时记得结果链表也要后移

  • 我们定义的新结果链表是有一个多余初始点的,所以我们返回的是结果链表的next

  • 由于最后结果链表会指向结果链表中的最后一个节点,所以在开始的时候需要再定义一个指针指向结果链表的开头才能返回正确的结果

该题目是链表相关的简单、经典题目,初学的同学们可以多看几遍,多做几次。

⭐链表合并补充知识

信息检索课程中会涉及到bool检索模型,该模型中有and、or、and not、not等操作,这些操作是对postings的操作,postings是记录哪些document中记载了该term的链表,且已经按从小到大排好序了。这些操作都和链表合并相关,区别如下:

  • and取的是两个链表的公共部分,所以是双指针从头遍历到某一链表结束即可,判断,小的一方的指针后移,相同大小的加入结果链表中;

  • or取的是两个链表的非重复部分,所以是双指针都要从头遍历到尾,判断,小的一方加入结果链表中并同时指针后移,相同大小的只随便选择一方加入结果链表中并指针后移即可;

  • not操作是针对某一链表来说的,与and not中的not类似,我们直接来看and not;

  • and not是取出在list1中同时不在list2中的节点,所以是双指针,其中list1的指针从头遍历到尾,判断,如果是list1的值小于list2的值,那么将list1的节点加入结果链表并指针后移;如果大于,那么list2的指针后移;如果相等,那么两个指针都后移

这里如果没学过可能会有点绕,不懂的地方欢迎评论区留言⭐~

⭐代码

/**
 * 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* list1, ListNode* list2) 
    {
        ListNode* ans=new ListNode(0);
        ListNode* first=ans;
        while(list1!=NULL||list2!=NULL)
        {
            if(list1==NULL)//表示list1没有未遍历到的节点了
            {
                while(list2!=NULL)//表示list2还有未遍历到的节点
                {
                    ans->next=list2;//加入结果链表
                    list2=list2->next;//指针后移:才能读取到下一个节点的信息
                    ans=ans->next;//指针后移:当前ans只有一个next,所以后移是为了避免最后发现ans只有一个next也就是覆盖的情况
                }
            }
            else if(list2==NULL)
            {
                while(list1!=NULL) 
                {
                    ans->next=list1;
                    list1=list1->next;
                    ans=ans->next;
                }
            }
            //前两段是剪枝,额外判断了某一链表为空,另一链表循环加入结果链表的情况
            else//该情况是说list1和list2都还有未遍历到的节点
            {
                if(list1->val<=list2->val)
                {
                    ans->next=list1;
                    ans=ans->next;
                    list1=list1->next;
                }
                else
                {
                    ans->next=list2;
                    ans=ans->next;
                    list2=list2->next;
                }
            }
        }
        return first->next;//注意:返回的一定是next
    }
};

提交结果

我的代码的时间消耗和内存消耗还有待改进,欢迎大家提供更高效的代码,如果过后有更优化的思路我还会继续更新的,大家评论区见!

点赞收藏不迷路⭐~

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

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

相关文章

【机器学习】包裹式特征选择之递归特征添加法

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

Unity 摄像机的深度切换与摄像机画面投影

摄像机可选&#xff1a;透视、正交 正交类似投影&#xff0c;1比1 透视类似人眼&#xff0c;近大远小 摄像机投影 在项目中新建&#xff1a;渲染器纹理 将新建纹理拖动到相机的目标纹理中 新建一个平面&#xff0c;将新建材质组件放到平面中即可。 相机深度切换 使用代…

探索Java开发面试笔记:以听为目的,助力编程技术提升与面试准备

文章目录 一、制作背景介绍二、 Java开发面试笔记&#xff1a;为你的编程之路加速2.1 公众号主题和目标读者群体2.2 为什么面试笔记对于提高编程视野和技术至关重要2.3 親測效率 三、形式案例3.1 文章形式3.2 手机案例3.3 电脑案例 一、制作背景介绍 做公众号的背景&#xff1a…

十九 超级数据查看器 讲解稿 分栏功能

十九 超级数据查看器 讲解稿 分栏功能 点击此处观看视频教程 讲解稿全文: 大家好&#xff0c;这讲介绍一下 &#xff0c;超级数据查看器的分栏功能。 分栏功能设计的初衷是为了让用户同时同地查询两个表格的数据&#xff0c;方便比较&#xff0c;获得更清晰的查询结果 分栏功…

模型优化_XGBOOST学习曲线及改进,泛化误差

代码 from xgboost import XGBRegressor as XGBR from sklearn.ensemble import RandomForestRegressor as RFR from sklearn.linear_model import LinearRegression as LR from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split,c…

如何添加极狐GitLab Runner 信任域名证书

本文作者 徐晓伟 极狐Gitlab Runner 信任实例域名证书&#xff0c;用于注册注册极狐 GitLab Runner。 问题 参见 极狐gitlab-runner-host.md 说明 解决方案是使用颁发给域名 gitlab.test.helm.xuxiaowei.cn 的证书&#xff0c;可以使用自己的域名去各大云厂商免费申请&#…

重学SpringBoot3-yaml文件配置

重学SpringBoot3-yaml文件配置 引言YAML 基本语法YAML 数据类型YAML 对象YAML 数组复合结构标量引用 YAML 文件结构Spring Boot 中的 YAML 配置注意事项总结参考 引言 YAML&#xff08;YAML Ain’t Markup Language&#xff09;是一种常用于配置文件的数据序列化格式&#xff…

Unity3D

一、C# 输入输出 二、三维数学

CSS变量和@property

CSS变量 var() CSS 变量是由CSS作者定义的实体&#xff0c;其中包含要在整个文档中重复使用的特定值。使用自定义属性来设置变量名&#xff0c;并使用特定的 var() 来访问。&#xff08;比如 color: var(--main-color);&#xff09;。 基本用法 CSS变量定义的作用域只在定义该…

搞定国科金 必备王炸新技术!凌恩生物重磅推出微生物单细胞测序产品

单细胞异质性研究如火如荼&#xff0c;但原核生物研究却是个“坎”。 现有常规的原核生物研究&#xff0c;都集中于单菌群落或微生态大群体&#xff0c;只能从宏观角度研究群体状态&#xff0c;而经典的单细胞RNA测序技术无法应用于细菌。 单细胞技术应用于原核生物的几点障碍…

window10 安装配置docker

前言&#xff08;重要&#xff09;&#xff1a;确认window10版本已经更新到最新版 随着时间推移&#xff0c;docker对window版本的支持也在变&#xff0c;截至2024年3月份&#xff0c;支持win10最低版本号&#xff1a;22H2,操作系统最低版本&#xff1a;19045.2965&#xff0c…

学编程怎么样才能更快入手,编程怎么简单易学

学编程怎么样才能更快入手&#xff0c;编程怎么简单易学 一、前言 对于初学编程建议先从简单入手&#xff0c;然后再学习其他复杂的编程语言。 今天给大家分享的中文编程开发语言工具 进度条构件的用法。 编程入门视频教程链接 https://edu.csdn.net/course/detail/39036 …

26、Qt调用.py文件中的函数

一、开发环境 Qt5.12.0 Python3.7.8 64bit 二、使用 新建一个Qt项目&#xff0c;右击项目名称&#xff0c;选择“添加库” 选择“外部库”&#xff0c;点击“下一步” 点击“浏览”&#xff0c;选择Python安装目录下的libs文件夹中的“python37.lib”文件&#xff0c;点击“下…

【Python如何输入工资,五险一金,专项扣除后得出个税和到手工资(2024年最新)】

最近综合所得年度汇算&#xff0c;正好心血来潮算一下到手工资对不对&#xff0c;有些朋友年综合收入也才几万块&#xff0c;结果年综报税时还要补一两万的个税&#xff0c;这主要是因为跳槽后&#xff0c;上家公司的年薪全平均移到了新的公司每个月中&#xff0c;系统的缺陷导…

第16课:如何出版人生第一本书

机会是留给有准备的人的&#xff0c;在网上多输出文章&#xff0c;就会有更好的曝光机会&#xff0c;有可能被潜在的机会捕捉到。 除了不断的写文章&#xff0c;还可以通过书籍封面的投稿信息进行文章投稿&#xff0c;投稿的文章一定要符合要求。 出书从来不是一件简单的事&am…

Spring MVC源码中设计模式——适配器模式

适配器模式介绍 适配器模式&#xff08;Adapter Pattern&#xff09;是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式&#xff0c;它结合了两个独立接口的功能。 应用场景&#xff1a; 1、系统需要使用现有的类&#xff0c;而此类的接口不符合系统的需要…

EdgeX Foundry 边缘物联网中间件平台

文章目录 1.EdgeX Foundry2.平台架构3.平台服务3.1.设备服务3.2.核心服务3.3.支持服务3.4.应用服务3.5.安全服务3.6.管理服务 EdgeX Foundry # EdgeX Foundryhttps://iothub.org.cn/docs/edgex/ https://iothub.org.cn/docs/edgex/edgex-foundry/1.EdgeX Foundry EdgeX Found…

JavaScript快速入门+文档查询【详解】

目录 1. js简介 2.js引入方式 3. JS基础语法(ECMAScript) 4. js函数和事件【js的核心】 5.js对象 6.BOM对象 7.DOM对象 8.案例全选全消 1. js简介 1.什么是js JavaScript&#xff0c;简称js&#xff0c;是web开发中不可缺少的脚本语言&#xff0c;不需要编译就能…

Spring Test 常见错误

前面我们介绍了许多 Spring 常用知识点上的常见应用错误。当然或许这些所谓的常用&#xff0c;你仍然没有使用&#xff0c;例如对于 Spring Data 的使用&#xff0c;&#xff0c;有的项目确实用不到。那么这一讲&#xff0c;我们聊聊 Spring Test&#xff0c;相信你肯定绕不开对…

IDEA自动导入provided的依赖

最近在学习flink 流程序&#xff0c;在写demo程序的时候依赖flink依赖&#xff0c;依赖的包在flink集群里面是自己已经提供了的&#xff0c;在导入的时候配置为provided&#xff0c;像下面这样&#xff0c;以使打包的时候不用打到最终的程序包里面。 <dependency><gro…