[LeetBook]【学习日记】有序链表合并

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. 在已有的链表 l1 上插入 l2(插入排序思想)
  2. 重新从空节点开始构建链表

在已有的链表 l1 上插入 l2(插入排序思想)

  1. 为什么会想到插入排序:插入排序的过程中,前半部分是有序的,后半部分的无序元素逐个插入前面的有序部分,这道题可以把 l1 视作排序完成的前半部分,l2 视作后半部分插入前半部分
  2. 在这种做法下,其实相当于把两个序列拼接起来后再排序
  3. 需要一个当前遍历到的 l1 元素的前一个元素的指针 preL1,便于插入 l2 元素;l2 元素在插入前应保存下一个要比较的 l2 元素 l2->next,否则无法接着遍历 ListNode* temp = l2->next;
  4. 使用假头 dummyHead,确保可以插入 l1 的第一个元素前面
  5. 遍历 l1 元素时使用 preL1 = l1; l1 = l1->next;
class Solution {
public:ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {//排除有空链表的情况if(!l1) return l2;if(!l2) return l1;ListNode* dummyHead1 = new ListNode(-101);dummyHead1->next = l1;ListNode* preL1 = dummyHead1;while(l1 && l2){while(l1 && l2->val >= l1->val){preL1 = l1;l1 = l1->next;}//此时l1为空;或者l2指向的节点比l1指向的节点小,比l1节点的前一个节点大if(!l1){//处理l1为空的情况preL1->next = l2;return dummyHead1->next;}//处理l2指向的节点比l1指向的节点小,比l1节点的前一个节点大的情况while(l2 && l2->val >= preL1->val && l2->val <= l1->val){preL1->next = l2;ListNode* temp = l2->next;l2->next = l1;preL1 = l2;l2 = temp;} }return dummyHead1->next;}
};

重新从空节点开始构建链表

  • 首先定义一个假头,然后比较 l1 和 l2 的元素,小的就添加在新链表的后面,不断循环,最后当有一个链表为空就把剩下的都接在新链表的后面即可
class Solution {
public:ListNode* trainningPlan(ListNode* l1, ListNode* l2) {ListNode* dum = new ListNode(0);ListNode* cur = dum;while(l1 && l2){if(l1->val <= l2->val){cur->next = l1;cur = l1;l1 = l1->next;}else{cur->next = l2;cur = l2;l2 = l2->next;}}if(!l1) cur->next = l2;if(!l2) cur->next = l1;return dum->next;}
};

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

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

相关文章

如何在电脑上中恢复已删除的视频

您可以在电脑中恢复已删除的视频&#xff0c;无需任何繁琐的工作。您所需要做的就是阅读本文&#xff0c;了解恢复已删除视频的最佳方法。 一次错误的点击可能会夺走您以视频形式存储的宝贵记忆。嗯&#xff0c;有些视频不适合删除&#xff0c;您希望永远保留它们。失去这些宝…

如何使用Docker搭建StackEdit编辑器并结合内网穿透实现远程办公

文章目录 前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安装VNC viewer连接工具4. 内网穿透4.1 安装cpolar【支持使用一键脚本命令安装】4.2 创建隧道映射4.3 测试公网远程访问 5. 配置固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址5.3 测试…

优选算法|【双指针】|1089.复写零

目录 题目描述 题目解析 算法原理讲解 代码 题目描述 1089. 复写零 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&#xff1a;请不要在超过该数组长度的位置写入元素。请对输入的数组 就…

LeetCode受限条件下可到达节点的数目

题目描述 现有一棵由 n 个节点组成的无向树&#xff0c;节点编号从 0 到 n - 1 &#xff0c;共有 n - 1 条边。 给你一个二维整数数组 edges &#xff0c;长度为 n - 1 &#xff0c;其中 edges[i] [ai, bi] 表示树中节点 ai 和 bi 之间存在一条边。另给你一个整数数组 restr…

OJ:移除链表元素

203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;这个题可以直接在原链表上进行修改&#xff0c;但是修改链表的指向是有点麻烦的&#xff0c;所以我们给两个指针&#xff0c;phead和ptail,这是新链表的两个指针&#xff0c;再给一个指针pcur来遍历…

Java和JavaScript区别

1. Java和javaScript都是面向对象语言 2. 他两除了名字相似之外没有任何关系 3. Java是一种真正的面向对象语言&#xff0c;不管开发什么程序都要设计对象&#xff1b;而JavaScript是种脚本语言&#xff0c;主要实现前端页面的交互&#xff0c;比如验证表单&#xff0c;弹窗提…

Sqli-labs靶场第12关详解[Sqli-labs-less-12]

Sqli-labs-Less-12 #手工注入 post传参了 根据题目看&#xff0c;像一个登录页面&#xff0c;尝试使用布尔型盲注测试能否登录网站 1. Username输入a a" 测试是否会有报错&#xff0c;burp抓包 报错&#xff1a;syntax to use near "a"") and passw…

消息中间件之RocketMQ源码分析(二十七)

Broker提交或回滚事务消息 当生产者本地事务处理完成并且Broker回查事务消息后&#xff0c;不管执行Commit还是Rollback,都会根据用户本地事务的执行结果发送一个End_transaction的RPC请求给Broker&#xff0c;Broker端处理该请求的类是EndTransactionProcessor 第一步&…

volatile 关键字 (一)

volatile 关键字 &#xff08;一&#xff09; 文章目录 volatile 关键字 &#xff08;一&#xff09;如何保证变量的可见性&#xff1f;如何禁止指令重排序&#xff1f; 文章来自Java Guide 用于学习如有侵权&#xff0c;立即删除 如何保证变量的可见性&#xff1f; 在 Java 中…

【Linux安装软件命令及vim、gcc使用说明】

安装软件命令 Linux安装软件的命令首先要进入管理员权限 首先在终端输入sudo su切换到管理员界面 输入对应的密码&#xff0c;注意这里的密码不会显示出来&#xff0c;输完密码之后回车即可。当出现root就代表已经是管理员界面了。 如果相应退出管理员界面输入exit即可。 注…

django-paramiko远程服务器和文件管理(五)

一、paramiko简介 1.paramiko是一个基于SSHv2协议的纯Python库。需要单独安装。 2.它提供了客户端和服务器的功能。 3.可以实现SSH2远程安全连接&#xff0c;支持用户名、密码连接&#xff0c;也支持密钥连接 4.一般用于执行远程命令、传输文件、中间SSH代理等 安装 pip3 in…

数组、冒泡排序、函数、作用域、对象、Math

数组 1.定义数组&#xff1a; a)通过字面量的方式定义数组 let ary[1,2,3,4]b)通过定义构造函数的方式定义数组&#xff1a; let 数组名new Array(值,值,值);数组的操作方式 a)增 //在数组末尾添加值 arr.push(新增的内容) //在数组的开始添加值 arr.unshift(新增的内容)b…

Redis主从复制+Redis哨兵模式+Redis群集模式

Redis主从复制Redis哨兵模式Redis群集模式一、Redis主从复制1、主从复制的作用2、主从复制过程3、搭建Redis主从复制3.1 所有节点服务器安装redis3.2 修改Redis配置文件(Master节点操作)3.3 修改Redis配置文件(Slave节点操作)3.4 验证主从效果 二、Redis哨兵模式1、哨兵模式的作…

8、IBOScms代码审计

一、sql注入 1、sql注入(Ⅰ) 限制 rreport/api/getlist {"offset":0,"type":"send","keyword":{"subject":"111) AND (updatexml(1,concat(0x7e,(select user()),0x7e),1))-- qw"}}复现 POST /?rreport/api/…

Vue开发实例(十一)用户列表的实现与操作

用户列表的实现与操作 一、创建用户页面和路由二、表格优化1、表头自定义2、表格滚动3、加入数据索引4、利用插槽自定义显示 三、功能1、查询功能3、增加4、删除5、修改 一、创建用户页面和路由 创建用户页面 在 src/components/Main 下创建文件夹user&#xff0c;创建文件Us…

Java ZooKeeper-RocketMQ 面试题

Java ZooKeeper-RocketMQ 面试题 前言1、谈谈你对ZooKeeper的理解 &#xff1f;2、Zookeeper的工作原理&#xff08;Zab协议&#xff09;3、谈谈你对分布式锁的理解&#xff0c;以及分布式锁的实现&#xff1f;4、 zookeeper 是如何保证事务的顺序一致性的&#xff1f;5、 zook…

设计模式之策略模式详解

目录 什么是策略模式 应用场景 业务场景实现 抽象类 实现类 Context上下文 测试类 策略模式的优缺点 什么是策略模式 他将定义的算法家族、分别封装起来&#xff0c;让他们之间可以相互替换&#xff0c;从而让算法的变化不会影响到使用算法的用户。 策略模式使用的就是…

idea出现莫名其妙错的时候

正常情况idea使用起来都很顺手&#xff0c;但是当项目比较多的时候&#xff0c;可能出现莫名奇妙的错误&#xff0c;比如导入的包始终报错java: 程序包com不存在&#xff0c;或者引入自己写的包也不存在&#xff0c;或者始终出现红线但是排查之后没有问题的情况&#xff0c;这种…

进来吧,给自己10分钟,这篇文章带你直接学会python

Python的语言特性 Python是一门具有强类型(即变量类型是强制要求的)、动态性、隐式类型(不需要做变量声明)、大小写敏感(var和VAR代表了不同的变量)以及面向对象(一切皆为对象)等特点的编程语言。 获取帮助 你可以很容易的通过Python解释器获取帮助。如果你想知道一个对象(o…

OJ:链表的中间结点

876. 链表的中间结点 - 力扣&#xff08;LeetCode&#xff09; 思路 思路&#xff1a;首先最容易想到的思路是什么呢&#xff0c;就是先遍历一遍链表&#xff0c;用一个值count来记录链表的长度&#xff0c;然后我们运用除法&#xff0c;/2&#xff0c;结果是几&#xff0c;就…