LeetCode刷题---21.合并两个有序链表(双指针)

news2024/12/29 8:36:44

文章目录

  • 一、编程题:19. 删除链表的倒数第 N 个结点(双指针-快慢指针)
      • 1.题目描述
      • 2.示例1:
      • 3.示例2:
      • 4.示例3:
      • 5.提示:
  • 二、解题思路
      • 1.思路
      • 2.复杂度分析:
      • 3.算法图解
  • 三、代码实现
  • 总结


一、编程题:19. 删除链表的倒数第 N 个结点(双指针-快慢指针)

1.题目描述

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

2.示例1:

在这里插入图片描述

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

3.示例2:

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

4.示例3:

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

5.提示:

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

二、解题思路

  这题采用双指针,本题主要关键点为:

  • 1.该怎么去移动这两个指针?这一点要理清楚。这里双指针移动就比较简单了,分别向下移动一步即可;
  • 2.本题中两个指针分别指向链表当前节点和其前驱节点,前驱节点(nodePrev)作用是方便后续节点插入链表,题目中两个链表都可以该思想;
  • 3.在遍历过程只要维护prev指针,需要做的就是调整链表的next指针;
  • 4.当 first 和 second 都不是空链表时,判断 first 和 second 哪一个链表的头节点的值更小,将较小值的节点添加到结果里,当一个节点被添加到结果里之后,将对应链表中的节点向后移一位;

1.思路

解决方法1(个人想法):

  • Step 1.创建指针first和second指针分别指向两个链表的头节点,此时first和second节点均为null,所以node1Prev = null, node2Prev = null;
  • Step 2.当first当前节点的值大于second节点的值时,就把second当前的节点接在first前驱节点node1Prev的后面,同时将second指针往后移一位(注:这里需要注意的是second第一个节点就比first第一个节点小时,那list1 = node2Prev,list1为返回的链表指针);
  • Step 3.当first当前节点值小于second时,则node1Prev指向first当前节点,first指针往后移动一位;
  • Step 4.重复2,3步骤,直到first或者second为null循环终止,当second不为null时,直接将链表list1末尾指向未合并完的链表即可;

看不懂解释的话,直接看算法图解比较容易理解点

2.复杂度分析:

时间复杂度:O(n+m),其中 n 和 m 分别为两个链表的长度。因为每次循环迭代中,l1 和 l2 只有一个元素会被放进合并链表中, 因此 while 循环的次数不会超过两个链表的长度之和。所有其他操作的时间复杂度都是常数级别的,因此总的时间复杂度为 O(n+m)。。
空间复杂度:O(1)。我们只需要常数的空间存放若干变量。

3.算法图解

同时遍历两个链表(蓝色部分代表first指针,灰色部分代表second指针)(注:本人不会做成流程动画,希望会的朋友可以私信我指点一二,说个软件名字也可以,谢谢

请添加图片描述


三、代码实现

每个代码块都写了注释,方便理解,代码还可以改进;

class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        if(list1 == null) return list2;
        else if(list2 == null) return list1;
        //把链表2有序插入到链表1中,再返回链表1的头结点
        ListNode first = list1, second = list2, node1Prev = null, node2Prev = null;
        while(second != null && first != null){
            if(second.val < first.val){
                node2Prev = second;
                second = second.next;
                // 插入节点
                addIndex(node1Prev, first, node2Prev);
                if(node1Prev == null) {
                    list1 = node2Prev;
                    node1Prev = node2Prev;
                }
                node1Prev = node2Prev;
            }else{
                node1Prev = first;
                first = first.next;    
            }
        }
        // 如果链表2没有合并完的话,接将链表末尾指向未合并完的链表即可
        if(second != null) node1Prev.next = second;
        return list1;
    }

    //参数分别为 前驱结点,当前结点,插入结点
    public void addIndex(ListNode prev, ListNode temp, ListNode index){

        if(prev == null){
            index.next = temp;
        }else{
            prev.next = index;
            index.next = temp;
        }
    }
}

提交结果:

在这里插入图片描述


总结

以上就是今天要讲的内容,这一题还是比较简单的,一看到这题的时候就立马想到同时遍历两个链表,然后把其中一个链表当做返回参数,让第二个链表的节点往里面插入即可。

感谢观看,如果有帮助到你,请给题解点个赞和收藏,让更多的人看到。🌹🌹🌹

也欢迎你,关注我。👍👍👍

你们的点赞和留言对我真的很重要!!! ✿✿✿

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

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

相关文章

【Linux】调试器 gdb 及 ‘\r‘ 的使用

目录 前言 gdb 断点 打断点 查看、删除断点 断点使能 调试 显示数据 其他指令 ‘\r’的使用 行缓冲区 小程序 前言 &#x1f951;在 Linux 下我们可以通过 gcc 进行编译&#xff0c;但与 vs 相比若想对代码进行调试&#xff0c;我们还需要学会使用调试器 gdb 。 &am…

Elastic Job学习笔记

目标&#xff1a; 第一章&#xff1a;概述 1、理解任务调度的概念 2、理解分布式任务调度的概念 3、能够说出Elastic-Job是什么 第二章&#xff1a;Elastic-Job快速入门 1、能够搭建Elastic-Job快速入门工程环境 2、能够编写Elastic-Job快速入门的程序 3、理解Elastic-Job整体架…

Studio 3T怎么用mysql语句执行查询

目录说明说明 mongo图形界面 Studio 3T怎么执行mongo的原生语句进行查询 就先说到这\color{#008B8B}{ 就先说到这}就先说到这 在下Apollo\color{#008B8B}{在下Apollo}在下Apollo 一个爱分享Java、生活的小人物&#xff0c;\color{#008B8B}{一个爱分享Java、生活的小人物&…

【前端】Vue项目:旅游App-(20)home:点击跳转至带参数的动态路由

文章目录目标过程与代码详情页detailhome中设置点击跳转效果总代码修改或添加的文件router/indexdetailhome-content参考本项目博客总结&#xff1a;【前端】Vue项目&#xff1a;旅游App-博客总结 目标 点击热门精选的item跳转至对应详情页&#xff1a; 详情页&#xff1a; 路…

什么是HTTPDNS?HTTPDNS有哪些作用?

近几年来&#xff0c;HTTPDNS技术大火&#xff0c;很多大的网站都开始部署自己的HTTDNS服务器&#xff0c;那么什么是HTTPDNS&#xff0c;HTTPDNS和传统的DNS技术相比有哪些区别&#xff1f;HTTPDNS又有哪些作用呢&#xff1f;针对这些问题&#xff0c;本文中科三方做下简单介绍…

【学习】Linux 系统 文件权限表示

学习内容描述&#xff1a;Linux 系统 文件权限格式 重点知识&#xff1a; Linux 系统 文件权限格式是10位&#xff0c;格式例如&#xff1a;-rw-rw-rw-&#xff0c;表示文件所有者、所属组、其他用户都具有读和写的权限 。 &#xff08;1&#xff09;第0位确定文件类型 其中: …

计算机组成原理 第三章笔记

视频网址 仅仅是笔记记录&#xff0c;若有错误请指出。 零碎的 存储器的分类 磁表面存储器:磁盘,磁带磁芯存储器半导体存储器 RAM ROM光存储器 看下面这个思维导图 存储器的性能指标 存储容量&#xff1a;存储字数字长单位成本: 每位价格总成本/总容量存储速度&#xff1a;数…

Android Studio Linux系统模拟器启动异常

一、报错&#xff1a;/dev/kvm device permission denied 1、首先检查/dec/kvm的所属关系 命令&#xff1a;ls -al /dev/kvm 可以看到&#xff0c;属于root用户&#xff0c;组也是root用户 2、查看当前用户是否在root组 命令&#xff1a;grep root /etc/group 显然是没有的…

C语言学习笔记-数组

C 数组 C 语言支持数组数据结构&#xff0c;它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据&#xff0c;但它往往被认为是一系列相同类型的变量。 数组的声明并不是声明一个个单独的变量&#xff0c;比如 runoob0、runoob1、…、runoob99&#x…

Project3:Ants Vs. SomeBees

Ants Vs. SomeBees1. 前言2. Phase 1&#xff1a;Basic gameplay3. Phase 2&#xff1a;More Ants&#xff01;4. Phase 3: Water and Might5. 测试结果1. 前言 本项目是 CS 61A 的第三个项目&#xff0c;要求是实现一个类似于植物大战僵尸的游戏&#xff0c;这里 Ants 就相当…

【redis】redis的过期策略以及内存淘汰机制

前言 今天我们讨论下redis的过期策略以及内存淘汰机制&#xff0c;如果你想要考察一个人对redis的了解&#xff0c;那吗这个问题是必选的&#xff0c;从他对这个问题的回答中&#xff0c;就可以了解到他的redis深浅。 过期策略 先来介绍下&#xff0c;Redis key 过期删除的策…

虹科产品 | 使用Redis企业版数据库为MySQL增添魅力!

MySQL读取数据慢&#xff1f; 难以轻松扩展&#xff1f; 数据搜索效率低&#xff1f; 无法实时分发数据集&#xff1f; 虹科Redis企业版数据库解决方案来了&#xff01;企业将Redis企业版数据库与MySQL一起使用&#xff0c;可以实现企业缓存或复制数据库&#xff0c;从而使应用…

MATLAB 非线性规划

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

uniapp APP分享;判断用户是否安装APP,已安装直接打开,未安装跳转下载页;uniapp 在外部打开APP(schemes)

场景&#xff1a; A将某商品分享给B&#xff0c;B点击后判断是否安装APP&#xff0c;若安装直接打开&#xff0c;没有安装则跳转下载页&#xff1b; 知识点&#xff1a; uniapp APP分享&#xff1b;判断用户是否安装APP&#xff0c;已安装直接打开&#xff0c;未安装跳转下载…

从零开始的数模(十一)微分方程建模

目录 一、概念 1.1什么是微分方程建模 1.2使用场合 二、基于python的微分方程建模 2.1scipy.integrate.odeint() 函数 ​编辑2.2案例 ​编辑 三、基于MATLAB的微分方程建模 四、偏微分方程的求解 一、概念 1.1什么是微分方程建模 微分方程建模是数学模型的重要方法&am…

AcWing 1081. 度的数量(数位DP)

AcWing 1081. 度的数量&#xff08;数位DP&#xff09;一、问题二 、数位DP三、解析1、题意理解2、题目分析三、代码一、问题 二 、数位DP 这道题是一道数位DP的题目&#xff0c;其实数位DP更像我们在高中阶段学过的排列组合问题中的分类讨论。 数位DP顾名思义就是按照数字的…

B/S端界面控件DevExtreme v22.2新功能 - 如何在日历中显示周数?

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序&#xff0c;该套件附带功能齐…

LeetCode-1145. 二叉树着色游戏【深度优先搜索,二叉树】

LeetCode-1145. 二叉树着色游戏【深度优先搜索&#xff0c;二叉树】题目描述&#xff1a;解题思路一&#xff1a;深度优先搜索分别计算x的左子树lsz和右子树rsz的节点个数。那么除去x与其左右子树的父子树的节点个数为n-1-lsz-rsz。贪心的&#xff0c;那么二号玩家其实可以占据…

Java基础学习笔记(十八)—— 转换流、对象操作流

转换流、对象操作流1 转换流1.1 构造方法1.2 指定编码读写2 对象操作流2.1 对象操作流概述2.2 对象序列化流2.3 对象反序列化流2.4 案例1 转换流 1.1 构造方法 转换流就是来进行字节流和字符流之间转换的 InputStreamReader&#xff1a;是从字节流到字符流的桥梁&#xff0c;…

Linux(八)线程概念

1、线程的本质 线程就是一个进程内部的控制序列 是CPU进行执行调度的基本单元。&#xff08;调度一段代码的执行是通过线程完成的&#xff09; 一个进程中至少有一个线程&#xff08;所以进程与线程的数量关系是 一对一 或 一对多&#xff09; 2、为什么把线程称为LWP LWP…