力扣题目解析--合并两个链表

题目

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

示例 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 均按 非递减顺序 排列

代码展示 

/*** 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*dummy=new ListNode(0);ListNode*current=dummy;while(list1&&list2){if(list1->val<list2->val){current->next=list1;list1=list1->next;}else{current->next=list2;list2=list2->next;}current=current->next;}if(list1){current->next=list1;}else{current->next=list2;}return dummy->next;}
};

写者心得 

current = current->next;解释

示例

假设我们有两个链表:

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

合并过程如下:

  1. 初始化 dummycurrent

    dummy -> null
    current -> dummy
  2. 第一次循环:

    • 比较 1 和 2,选择 1
    • 连接 1 到 current 的下一个位置。
    • 移动 current 到 1
    dummy -> 1 -> null
    current -> 1
  3. 第二次循环:

    • 比较 3 和 2,选择 2
    • 连接 2 到 current 的下一个位置。
    • 移动 current 到 2
    dummy -> 1 -> 2 -> null
    current -> 2
  4. 第三次循环:

    • 比较 3 和 4,选择 3
    • 连接 3 到 current 的下一个位置。
    • 移动 current 到 3
    dummy -> 1 -> 2 -> 3 -> null
    current -> 3
  5. 第四次循环:

    • 比较 5 和 4,选择 4
    • 连接 4 到 current 的下一个位置。
    • 移动 current 到 4
    dummy -> 1 -> 2 -> 3 -> 4 -> null
    current -> 4
  6. 第五次循环:

    • 比较 5 和 6,选择 5
    • 连接 5 到 current 的下一个位置。
    • 移动 current 到 5
    dummy -> 1 -> 2 -> 3 -> 4 -> 5 -> null
    current -> 5
  7. 第六次循环:

    • 比较 null 和 6,选择 6
    • 连接 6 到 current 的下一个位置。
    • 移动 current 到 6
    dummy -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> null
    current -> 6
  8. 处理剩余节点:

    • list1 已经为空,将 list2 剩余的部分连接到 current 的下一个位置。
    • 由于 list2 也已经为空,所以不需要额外操作。
  9. 返回结果:

    return dummy->next;

    结果链表为:

    1 -> 2 -> 3 -> 4 -> 5 -> 6

代码的逐行解释 

创建虚拟头节点

        ListNode* dummy = new ListNode(0);ListNode* current = dummy;
  • ListNode* dummy = new ListNode(0);:创建一个虚拟头节点 dummy,初始化值为0,指针为nullptr。
  • ListNode* current = dummy;:创建一个指针 current,初始化指向 dummycurrent 用于跟踪结果链表的当前末尾节点。

合并两个链表

        while (list1 && list2) {
  • while (list1 && list2):当 list1 和 list2 都不为空时,进入循环。

选择较小节点

            if (list1->val < list2->val) {current->next = list1;list1 = list1->next;} else {current->next = list2;list2 = list2->next;}
  • if (list1->val < list2->val):比较 list1 和 list2 当前节点的值。
    • 如果 list1 的值小于 list2 的值:
      • current->next = list1;:将 list1 当前节点连接到 current 的下一个位置。
      • list1 = list1->next;:将 list1 指针移动到下一个节点。
    • 否则:
      • current->next = list2;:将 list2 当前节点连接到 current 的下一个位置。
      • list2 = list2->next;:将 list2 指针移动到下一个节点。

更新 current 指针

            current = current->next;
  • current = current->next;:将 current 指针移动到刚刚连接的节点上,确保 current 始终指向结果链表的最后一个节点。

处理剩余节点

        if (list1) {current->next = list1;} else {current->next = list2;}
  • if (list1):如果 list1 不为空:
    • current->next = list1;:将 list1 剩余的部分连接到 current 的下一个位置。
  • else:如果 list1 为空(即 list2 不为空):
    • current->next = list2;:将 list2 剩余的部分连接到 current 的下一个位置。

返回结果链表的头节点

        return dummy->next;}
};
  • return dummy->next;:返回结果链表的头节点。注意跳过虚拟头节点 dummy,返回 dummy->next

总结

通过上述逐行解析,我们可以看到:

  • 虚拟头节点 dummy 用于简化边界条件的处理。
  • while 循环用于不断选择两个链表中较小的节点,并将其连接到结果链表中。
  • if 语句用于比较两个节点的值,并选择较小的一个。
  • current 指针始终指向结果链表的最后一个节点,确保下一次循环中可以继续添加新的节点。
  • 最后处理剩余节点,确保所有节点都被正确连接到结果链表中。

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

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

相关文章

基于yolov8、yolov5的鸟类分类系统(含UI界面、训练好的模型、Python代码、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下&#xff1a; 算法模型&#xff1a;     yolov8、yolov8 SE注意力机制 或 yolov5、yolov5 SE注意力机制 &#xff0c; 直接提供最少两个训练好的模型。模型十分重要&#xff0c;因为有些同学的电脑没有 GPU&#xff0…

css:浮动

网页的本质上就是摆放盒子&#xff0c;把盒子摆到相应的位置上 css提供了三种传统的布局方式&#xff1a; 普通流&#xff08;标准流&#xff09;&#xff1a;标签按默认方式排列&#xff0c;最基本的布局方式 浮动 定位 实际开发中&#xff0c;一个网页基本包含了三种这种布局…

Essential Cell Biology--Fifth Edition--Chapter one (6)

1.1.4.4 Internal Membranes Create Intracellular Compartments with Different Functions [细胞膜形成具有不同功能的细胞内隔室] 细胞核、线粒体和叶绿体并不是真核细胞中唯一的膜包围细胞器。细胞质中含有大量的[ a profusion of]其他细胞器&#xff0c;这些细胞器被单层膜…

量子奇异值阈值算法

特征值分解只适用于方阵&#xff0c;如何扩展到任意形状的矩阵呢&#xff1f;奇异值分解能够解决此问题。量子奇异值阈值算法在奇异值分解的基础上将小的特征值设置为0&#xff0c;从而将小的特征值及其对应的特征向量去掉&#xff0c;进而降低矩阵的秩&#xff0c;达到降维的目…

Python_爬虫3_Requests库网络爬虫实战(5个实例)

目录 实例1&#xff1a;京东商品页面的爬取 实例2&#xff1a;亚马逊商品页面的爬取 实例3&#xff1a;百度360搜索关键词提交 实例4&#xff1a;网络图片的爬取和存储 实例5&#xff1a;IP地址归地的自动查询 实例1&#xff1a;京东商品页面的爬取 import requests url …

黑马微项目

目录 1 飞机票 2 生成一个五位数验证码 3 数字加密 4 数字解密 5 抢红包 6 双色球系统 7 用户登录 8 金额转换 9 手机号屏蔽 10 罗马数字转换 11 调整字符串 12 初级学生管理系统&#xff08;学生数据的管理&#xff09; 13 学生管理系统&#xff08;用户的相关操…

基于lighthouse搭建私有网盘Cloudreve【开源应用实践】

基于lighthouse搭建私有网盘Cloudreve【超高性价比】 今天给大家分享一款私人网盘神器&#xff0c;既能存放你的文件文档&#xff0c;也能替你保存那不可告人的秘密~ 香菇今天将手把手教给大家如何在腾讯云轻量应用服务器上搭建个人专属网盘 1. 既爱又恨的网盘存储 很多小伙伴…

博物馆实景复刻:开启沉浸式文化体验的新篇章

随着数字化技术的飞速发展&#xff0c;博物馆的展览形式正在经历一场前所未有的变革。3数字博物馆和3D线上展览&#xff0c;这种创新的展览方式不仅打破了时间和空间的限制&#xff0c;更让文化遗产的保护与传承迈上了一个新的台阶。 本文将深入探讨博物馆实景复刻虚拟展厅的兴…

java中设计模式的使用(持续更新中)

概述 设计模式的目的&#xff1a;编写软件过程中&#xff0c;程序员面临着来自耦合性&#xff0c;内聚性以及可维护性&#xff0c;可扩展性&#xff0c;重用性&#xff0c;灵活性等多方面的挑战&#xff0c;设计模式是为了让程序&#xff08;软件&#xff09;&#xff0c;具有…

linux基础io重定向

文章目录 目录 文章目录 前言 一、函数的认识 1、认识close函数和dup2函数 1、close函数&#xff1a; ​编辑 2、write、read函数 1、write函数 2、read函数 二、重定向 1.引入函数dup2 ​编辑 2、输出重定向 3.输出重定向 三、myshell重定向 总结 前言 接上一篇&#xff0c;…

[STM32] 定时器应用之输出比较 (五)

文章目录 1.输出比较2.PWM 介绍3.配置PWM 1.输出比较 OC: 输出比较。 输出比较可以通过比较CNT与CCR寄存器值的关系&#xff0c;来对输出电平进行置1、置0或翻转的操作&#xff0c;用于输出一定频率和占空比的PWM波形。每个高级定时器和通用定时器都拥有4个输出比较通道高级定…

【计算机毕设】无查重 基于python豆瓣电影评论舆情数据可视化系统(完整系统源码+数据库+开发笔记+详细部署教程)✅

目录 【计算机毕设】无查重 基于python豆瓣电影数据可视化系统&#xff08;完整系统源码数据库开发笔记详细部署教程&#xff09;✅ 一、项目背景 二、项目目标 三、项目功能 四、开发技术介绍 五、数据库设计 六、项目展示 七、开发笔记 八、启动步骤文档 九、权威教…

后台管理系统窗体程序:个人中心

目录 个人中心的功能介绍&#xff1a; 1、进入页面 2、页面内的各种功能设计 &#xff08;1&#xff09;修改按钮 &#xff08;2&#xff09;页面的进入退出操作 一、网页设计 二、html代码 三、css代码 四、js代码 本次项目为后台管理系统&#xff0c;在本系统内的第七…

PLC如何支持GEM300标准?SECS/GEM通讯协议

1. 提供技术服务&#xff0c;保证户使用没问题 2. 支持市场所有的常规PLC 3. 支持常规组态软件&#xff0c;如wincc、组态王、组态屏等 4. 支持各类传感器&#xff0c;私有协议、modbus、web等 5. 无需二次开发&#xff0c;只需配置映射到已有的PLC地址 GEM300协议是为了满…

用 Google Sheets 表格增强 Tableau 数据分析的 3 种玩法

轻松实现文本翻译、网页数据抓取&#xff0c;甚至创建高级日期表来增强 Tableau 可视化效果&#xff01; 作为一款强大的数据可视化工具&#xff0c;Tableau 的可视化能力毋庸置疑。然而&#xff0c;对于跟表格打交道的用户来说&#xff0c;它没有“创建表格”的功能&#xff0…

计算机网络 (3)计算机网络的性能

一、计算机网络性能指标 速率&#xff1a; 速率是计算机网络中最重要的性能指标之一&#xff0c;它指的是数据的传送速率&#xff0c;也称为数据率&#xff08;Data Rate&#xff09;或比特率&#xff08;Bit Rate&#xff09;。速率的单位是比特/秒&#xff08;bit/s&#xff…

CAP与BASE分布式理论

CAP理论 C&#xff1a;Consistency 一致性&#xff1a;指强一致性&#xff0c;分布式系统中的所有节点在同一时刻具有同样的值、都是最新的数据副本&#xff0c;一致性保证了不管向哪台服务器写入数据&#xff0c;其他的服务器能实时同步数据 强一致性&#xff1a;写入数据的时…

【Java基础知识系列】之Java类的初始化顺序

前言 类的初始化顺序 简单场景 代码示例 public class Person {private String name initName();private String initName() {System.out.println("【父类】初始化实例变量name");return "【父类】史蒂夫";}private int age;private static int staticVa…

探索大规模语言模型(LLM)在心理健康护理领域中的应用与潜力

概述 心理健康是公共卫生最重要的领域之一。根据美国国家精神卫生研究所&#xff08;NIMH&#xff09;的数据&#xff0c;到 2021 年&#xff0c;22.8% 的美国成年人将患上某种形式的精神疾病。在全球范围内&#xff0c;精神疾病占非致命性疾病负担的 30%&#xff0c;并被世界…

解决 idea windows 设置maven离线模式之后,maven继续请求远程仓库

在内网开发的时候经常遇到没有办法来链接远程仓库的情况&#xff0c;这个时候需要设置maven的离线模式。 idea windows 设置maven离线模式之后&#xff0c;maven继续请求远程仓库 当设置完离线模式之后&#xff0c;有的时候执行maven的命令会报错&#xff0c;提示请求远程失败…