LeetCode合并两个有序链表

news2024/12/23 8:12:55

题目描述:

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

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

示例 2:

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

示例 3:

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

代码


/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} list1
 * @param {ListNode} list2
 * @return {ListNode}
 */
var mergeTwoLists = function(list1, list2) {
    if(list1 === null) {
        return list2;
    }
    if(list2 === null) {
        return list1;
    }
    if(list1.val < list2.val) {
        list1.next = mergeTwoLists(list1.next, list2);
        return list1;
    } else {
        list2.next = mergeTwoLists(list2.next, list1);
        return list2;
    }
};

代码分析

这段代码是一个 JavaScript 函数,用于合并两个有序的单链表。下面是对代码的逐行解释:

  1. 首先,代码中定义了一个单链表节点 ListNode 的构造函数。这个构造函数接收两个参数:valnextval 是节点的值,next 是指向下一个节点的指针(在 JavaScript 中,指针通常是另一个节点对象或 null 表示链表的末尾)。

    function ListNode(val, next) {
        this.val = (val===undefined ? 0 : val)
        this.next = (next===undefined ? null : next)
    }
    
  2. 接下来,定义了 mergeTwoLists 函数,它接收两个参数:list1list2。这两个参数是指向单链表头节点的指针。

    var mergeTwoLists = function(list1, list2) {
        // ...
    };
    
  3. 函数内部首先检查 list1 是否为 null。如果是,说明 list1 是一个空链表,因此直接返回 list2

    if(list1 === null) {
        return list2;
    }
    
  4. 然后,检查 list2 是否为 null。如果是,说明 list2 是一个空链表,因此直接返回 list1

    if(list2 === null) {
        return list1;
    }
    
  5. 如果两个链表都不为空,接下来比较 list1list2 的当前节点的值(val)。

    if(list1.val < list2.val) {
        // ...
    } else {
        // ...
    }
    
  6. 如果 list1 的当前节点值小于 list2 的当前节点值,将 list1next 指针指向递归调用 mergeTwoLists 的结果,这个递归调用将合并 list1 的下一个节点和整个 list2 链表。然后,返回 list1 作为合并后链表的头节点。

    list1.next = mergeTwoLists(list1.next, list2);
    return list1;
    
  7. 如果 list1 的当前节点值大于或等于 list2 的当前节点值,将 list2next 指针指向递归调用 mergeTwoLists 的结果,这个递归调用将合并 list1list2 的下一个节点。然后,返回 list2 作为合并后链表的头节点。

    list2.next = mergeTwoLists(list1, list2.next);
    return list2;
    
  8. 递归调用将持续进行,直到至少有一个链表为空。这时,非空链表将直接连接到递归调用返回的链表上,完成合并。

这个函数通过递归的方式,有效地合并了两个有序链表,保证了合并后的链表仍然是有序的。

案例分析:

让我们通过一个具体的例子来分析 mergeTwoLists 函数的执行过程。假设我们有两个有序链表:

list1: 1 -> 3 -> 5
list2: 2 -> 4 -> 6

下面是合并这两个链表的步骤:

  1. 初始化比较:首先,我们比较两个链表的头节点 list1(值为1)和 list2(值为2)。因为 1 < 2,我们选择 list1 的节点作为合并后链表的第一个节点。

  2. 递归调用:然后,我们将 list1next 指针指向 mergeTwoLists 的递归调用结果,这次调用的参数是 list1.next(即值为3的节点)和 list2

  3. 继续比较:递归调用中,我们再次比较 list1.next(值为3)和 list2。这次 3 > 2,所以我们选择 list2 的节点作为合并链表的下一个节点。

  4. 递归调用 list2list2next 指针现在指向 mergeTwoLists 的另一个递归调用结果,参数是 list1(值为1的节点)和 list2.next(即值为4的节点)。

  5. 继续递归:在这次递归调用中,1 < 4,所以 list1(值为1的节点)成为合并链表的当前节点。然后,list1.next(值为3的节点)和 list2.next(值为4的节点)再次进行比较。

  6. 合并完成:随着递归的进行,list1list2 中剩余的节点将依次被合并。最终,当其中一个链表为空时,递归结束,另一个链表将直接连接到合并链表的末尾。

  7. 最终结果:经过上述步骤,我们得到合并后的有序链表:

合并后的链表: 1 -> 2 -> 3 -> 4 -> 5 -> 6

这个过程展示了 mergeTwoLists 函数如何通过递归地选择较小的节点并连接剩余的链表部分来合并两个有序链表。每次递归调用都简化了问题,直到问题变得足够简单(即其中一个链表为空),然后逐步返回并构建最终的合并链表。

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

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

相关文章

以FLV解复用为例详解开源库FFmpeg中解复用器的源码逻辑及处理流程

目录 1、FFmpeg简介 2、FLV文件格式介绍 3、注册解复用器 4、解复用器的处理 4.1、AVFormatContext 4.1.1、AVClass 4.1.2、AVOption 4.1.3 AVDictionary—AV字典 4.1.4、AVIOContext 4.1.4.1、URLProtocol 4.1.4.2、AVIOContext的初始化及获取 4.1.5、AVInputF…

基于vue篮球联盟管理系统pf

TOC springboot476基于vue篮球联盟管理系统pf 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往往是人们思想上不可跨域…

Python入门教程(超详细)

《网络安全自学教程》 Python是一种「基于C语言」实现的&#xff0c;「开源」的&#xff0c;「面向对象的」的&#xff0c;「动态数据类型」的「解释型」语言。 Python的语法「简单」且「优雅」&#xff0c;相对于其他语言学习「难度较低」&#xff0c;入门非常快。 Python的…

【C++】使用红黑树封装map与set

文章目录 1. 源码分析2. 调整红黑树的结构搭建map、set3. 红黑树的迭代器3.1 普通迭代器3.2 const迭代器3.3 map的operator[ ] 4. 完整代码4.1 RBTree4.2 MyMap4.3 MySet 对于map与set&#xff0c;它们一个是KV模型&#xff0c;一个是K模型&#xff0c;那我们要写两个红黑树吗&…

基于Springboot网上蛋糕售卖店管理系统的设计与实现--论文pf

TOC springboot504基于Springboot网上蛋糕售卖店管理系统的设计与实现--论文pf 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和…

解决springboot中Aspect注解不生效问题

如下图所示&#xff0c;配置了一个注解类型的Aspect&#xff0c;结果一直不生效 运行结果可以看到&#xff0c;其他非注解类型的Aspect都顺利执行了&#xff0c;但是这个注解的切面就是没有执行 当时也在网上搜了半天&#xff0c;包括在启动类增加配置&#xff0c;接口都要加上…

Java语言程序设计基础篇_编程练习题**16.30(模式识别:连续四个相同的数)

目录 题目&#xff1a;**16.30&#xff08;模式识别&#xff1a;连续四个相同的数&#xff09; 习题思路 代码示例 结果展示 题目&#xff1a;**16.30&#xff08;模式识别&#xff1a;连续四个相同的数&#xff09; 为编程练习题8.19编写一个GUI程序。让用户在6行7列的网格的…

实时手势识别(2)- 基于关键点分类实现零样本图片的任意手势的识别

目录 前言 1.实现效果 2.关键点分类网络 3.KPNet训练测试数据准备 4.训练结果 4.1训练过程可视化 4.2验证集上的混淆矩阵 4.测试结果 4.1不同规模模型的测试结果对比 4.2分类结果投影到第一象限 4.3测试集上的混淆矩阵 4.4 二义性手势结果 4.5视频实测 5.零样本的…

深入理解计算机系统 CSAPP 实验lab:Architecture Lab

前期准备参考: 深入理解计算机系统 CSAPP 第四章 Y86-64模拟器 安装与使用-CSDN博客 writeup上写了要求,这里就不赘述了. Part A: sum.ys: # Execution begins at address 0 .pos 0irmovq stack, %rsp # Set up stack pointercall main # Execute main programhalt # …

【CRT实用小技巧(1)】一键发送命令到所有会话窗口

CRT实用小技巧&#xff08;1&#xff09;一键发送命令到所有会话窗口 在view&#xff08;视图&#xff09;中打开command windows&#xff08;命令窗口&#xff09; 打开后&#xff0c;可以看到下面的命令窗口了 然后再下面的命令窗口中&#xff0c;右键出菜单&#xff0c;选择…

centos7突然掉电后启动报错/dev/mapper/centos-root does not exist

问题现象 物理服务器SR588已安装centos7&#xff0c;突然掉电后系统进不去&#xff0c;提示/dev/mapper/centos-root does not exist 问题解决过程 网上搜索相关的解决方法 1、 用此方法不行 2、 用此方法也是不行 3、 分析查看ls /dev/mapper&#xff0c;目录底下没有cent…

Kafka运行机制(一):Kafka集群启动,controller选举,生产消费流程

前置知识 Kafka基本概念https://blog.csdn.net/dxh9231028/article/details/141270920?spm1001.2014.3001.5501 1. Kafka集群启动 Kafka在启动集群中的各个broker时&#xff0c;broker会向controller注册自己&#xff0c;并且从controller节点同步集群元数据。 broker是Kaf…

栈和堆的区别

存储内容不同&#xff1a; 栈区&#xff1a;主要存储函数调用时的局部变量、函数参数等。栈底是函数调用后的下一条指令。 堆区&#xff1a;存储动态分配的内存&#xff0c;如使用 new 分配的内存&#xff0c;具体内容由程序员安排。 管理方式不同&#xff1a; 栈区&#x…

牛客刷题二叉树(三)

1.输出二叉树的右视图 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** 求二叉树的右视图* param preOrder int整型一维数组 先序遍历* param inOrder int整型一维数组 中序…

【无线通信发展史⑤】万有引力定律的推导前奏3.0,本次学习开普勒三大定律,成就“天空立法者”的美名

前言&#xff1a;用这几个问答形式来解读下我这个系列的来龙去脉。如果大家觉得本篇文章不水的话希望帮忙点赞收藏加关注&#xff0c;你们的鼓舞是我继续更新的动力。 我为什么会写这个系列呢&#xff1f; 首先肯定是因为我本身就是一名从业通信者&#xff0c;想着更加了解自…

高性能 Web 服务器:让网页瞬间绽放的魔法引擎(中)

目录 一.Nginx版本和安装方式:源码编译安装 1.验证版本及编译参数 2.使用安装完成的二进制文件nginx 3.Nginx 启动文件 二.平滑升级和回滚 三.全局配置 实现 nginx 的高并发配置 四.核心配置&#xff1a;新建一个 PC web 站点 五.核心配置&#xff1a;location的详细使用…

vscode 远程控制ssh操作步骤

1.下载拓展Remote - SSH 打开Visual Studio Code&#xff0c;进入拓展市场(CtrlShiftX)&#xff0c;下载拓展Remote - SSH 2.选择远程(隧道/SSH)类别 点击远程资源管理器选项卡&#xff0c;并选择远程(隧道/SSH)类别 4.在弹出的选择配置文件中&#xff0c;点击第一个 5. 连接到…

基于PHP网上投票系统---附源码121500

摘 要 随着全球Internet的迅猛发展和计算机应用的普及&#xff0c;特别是近几年无线网络的广阔覆盖以及无线终端设备的爆炸式增长&#xff0c;使得人们能够随时随地的访问网络&#xff0c;以获取最新信息、参与网络活动、和他人在线互动。为了能及时地了解民情民意&#xff0c;…

深度学习基础—学习率衰减与局部最优问题

1.学习率衰减 下图中&#xff0c;蓝色的线是min-batch梯度下降法过程中较大学习率的的优化路径&#xff0c;绿线是较小学习率的优化路径。 如果使用min-batch梯度下降法&#xff0c;在模型的学习过程中&#xff0c;会有很多噪声&#xff0c;在靠近最小值的时候&#xff0c;由于…

考试:数据库系统(02)

关系代数 ◆并&#xff1a;结果是两张表中所有记录数合并&#xff0c;相同记录只显示一次。 ◆交&#xff1a;结果是两张表中相同的记录。 ◆差&#xff1a;S1-S2, 结果是S1表中有而S2表中没有的那些记录。 ◆笛卡尔积&#xff1a;S1*S2,产生的结果包括S1和S2的所有属性列&…