leetcode21合并两个有序链表

题目:

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

示例 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:循环+双指针

用示例一来演示,引入结果节点P,对l1和l2的头节点进行比较,1=1,优先把l2的节点挂到结果中,l2指针后移。再比较l1的1和l2的3,1<3,则把l1的节点挂到结果中,l1指针后移。2<3,则把l1的2挂到结果中,l1指针后移。4>3,则把l2的3挂到结果中,l2指针后移。4=4,把l2的节点挂到结果中,l2指针后移,这时候l2的指针已经到末尾了,已经null了,则把l1的剩下的链表节点都挂到结果链表中,这样就得到了合并的链表。

用红色来表示l1的节点,则新链表为:1->1->2->3->4->4

时间复杂度为O(m+n).因为两个链表都要遍历一遍,m和n分别为链表的元素个数。

空间复杂度为O(1).

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode mergeTwoLists(ListNode list1, ListNode list2) {if(list1==null)//边界情况return list2;if(list2==null)//边界情况return list1;ListNode resultNode=new ListNode(0);ListNode p=resultNode;//结果节点while(list1!=null&&list2!=null){//比较if(list1.val<list2.val){//l1节点的值小则把l1节点挂结果中p.next=list1;list1=list1.next;}else{p.next=list2;list2=list2.next;}p=p.next;}if(list1!=null){//其中一个链表指针遍历到末尾之后看哪个链表还没遍历完,若是l1没遍历完则把l1剩下的挂在结果中p.next=list1;}if(list2!=null){p.next=list2;//把l2没遍历完的挂在结果中}return resultNode.next;}
}

在IDEA上运行用的完整代码:

class ListNode{int val;ListNode next;ListNode(int val){this.val=val;}public void add(int newval){ListNode newNode=new ListNode(newval);if(this.next==null){this.next=newNode;}elsethis.next.add(newval);}public void print(){System.out.print(this.val);if(this.next!=null){System.out.print("->");this.next.print();}}
}
public class leetcode5 {/*循环+双指针解决*/static ListNode mergeTwoLists(ListNode l1,ListNode l2){if(l1==null)return l2;if(l2==null)return l1;ListNode resultNode=new ListNode(0);ListNode p=resultNode;while(l1!=null&&l2!=null){if(l1.val<l2.val){p.next=l1;l1=l1.next;}else{p.next=l2;l2=l2.next;}p=p.next;}if(l1!=null){p.next=l1;}if(l2!=null){p.next=l2;}return resultNode.next;}public static void main(String[] args) {ListNode l1=new ListNode(1);l1.add(2);l1.add(4);l1.print();System.out.println();ListNode l2=new ListNode(1);l2.add(3);l2.add(4);l2.print();System.out.println();mergeTwoLists(l1,l2).print();System.out.println();System.out.println("hello list");/*1->2->41->3->41->1->2->3->4->4hello list */}
}

解法2:递归

还是以示例一来演示,本来l1是1->2->4。l2是1->3->4。就是这两个链表要合并。然后如果把l2的1合并到l1之后就相当于是新l1:1->1->2->4和l2:3->4要合并。所以可以用递归来解决。

时间复杂度为O(m+n)

空间复杂度为O(m+n)

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode mergeTwoLists(ListNode list1, ListNode list2) {if(list1==null)return list2;if(list2==null)return list1;if(list1.val<list2.val){list1.next=mergeTwoLists(list1.next,list2);return list1;}list2.next=mergeTwoLists(list1,list2.next);return list2;}
}

在IDEA上运行用的完整代码:

class ListNode{int val;ListNode next;ListNode(int val){this.val=val;}public void add(int newval){ListNode newNode=new ListNode(newval);if(this.next==null){this.next=newNode;}elsethis.next.add(newval);}public void print(){System.out.print(this.val);if(this.next!=null){System.out.print("->");this.next.print();}}
}
public class leetcode5 {/*递归解决*/static ListNode mergeTwoLists2(ListNode l1,ListNode l2){if(l1==null)return l2;if(l2==null)return l1;if(l1.val<l2.val){l1.next=mergeTwoLists2(l1.next,l2);return l1;}l2.next=mergeTwoLists2(l1,l2.next);System.out.print("->");System.out.print(l2.val);return l2;}public static void main(String[] args) {ListNode l1=new ListNode(1);l1.add(2);l1.add(4);l1.print();System.out.println();ListNode l2=new ListNode(1);l2.add(3);l2.add(4);l2.print();System.out.println();System.out.println("hello list");System.out.println("下面的链表要倒着看");mergeTwoLists2(l1,l2);/*1->2->41->3->4hello list下面的链表要倒着看->4->4->3->2->1->1*/}
}

加油加油^_^

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

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

相关文章

智慧农业农场小程序源码 智慧农场系统源码

智慧农业农场小程序源码 智慧农场系统源码 一、 智慧农场系统的组成 智慧农场系统一般包括传感器、控制器、数据采集与处理平台、应用软件等组成部分。其中, 传感器主要用于采集土壤温度、湿度、光照强度等环境参数,以及作物生长状态、水肥情况等生产信息。控制器则根据传感器…

一个关于 i++ 和 ++i 的面试题打趴了所有人

前言 都说大城市现在不好找工作&#xff0c;可小城市却也不好招人。 我们公司招了挺久都没招到&#xff0c;主管感到有些心累。 我提了点建议&#xff0c;是不是面试问的太深了&#xff0c;在这种小城市&#xff0c;能干活就行。 他说自己问的面试题都很浅显&#xff0c;如果答…

你写过的最蠢的代码是?

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Parseval’s Theorem Parseval’s Identity of Fourier Transform

https://www.tutorialspoint.com/parseval-s-theorem-and-parseval-s-identity-of-fourier-transform

最新AI创作系统+ChatGPT网站源码+支持GPT4.0+支持ai绘画+支持国内全AI模型

一、AI创作系统 SparkAi系统是基于很火的GPT提问进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT系统&#xff1f;小编这里写一个详细图文教程吧&#x…

Unity引擎更新收费模式:从收入分成转向游戏安装量,将会有哪些影响呢

一、前言 Unity 引擎宣布自 2024 年 1 月 1 日起&#xff0c;将根据游戏安装量对开发者进行收费。官网通知如下 收费模式如图 这张图的大致意思就是&#xff0c; 从2024年1月1日开始&#xff0c;Unity将对所有达标的用户&#xff08;开发者&#xff09;根据游戏安装量征收“安…

ARM Linux DIY(十三)Qt5 移植

前言 板子带有屏幕&#xff0c;那当然要设计一下 GUI&#xff0c;对 Qt5 比较熟悉&#xff0c;那就移植它吧。 移植 Qt5 buildroot 使能 Qt5&#xff0c;这里我们只开启核心功能 gui module --> widgets module 编译 $ make ODIY_V3S/ qt5base编译报错&#xff1a;找不…

Windows11系统C盘用户文件夹下用户文件夹为中文,解决方案

说明&#xff1a; 1. 博主电脑为Windows11操作系统&#xff0c;亲测有效&#xff0c;修改后无任何影响&#xff0c;软件都可以正常运行&#xff01; 2. Windows10系统还不知道可不可行&#xff0c;因为Windows11的计算机管理中没有本地用户和组&#xff0c;博主在csdn上看到很…

【斗罗2】霍雨浩实力被否定,超级斗罗眼光被嘲,魂导院成功捡漏

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析斗罗大陆2绝世唐门。 最新一集《绝世唐门》已经更新&#xff0c;相信不少小伙伴和小郑一样都已经先睹为快&#xff0c;本集虽然是过渡剧情&#xff0c;但本身还是有不少有意思的剧情&#xff0c;作为过渡文戏也算是可圈可…

网工基础知识——以太网

1972年Bob Metcalfe“以太网之父”被Xerox雇佣为网络专家&#xff0c;Bob Metcalfe 来到Xerox公司的Palo Alto研究中心&#xff08;PARC&#xff09;的第一个任务是把Palo Alto的计算机连接到ARPANET&#xff08;Internet的前身&#xff09;上。1972年底Bob Metcalfe以ALOHA系统…

修改配置maven镜像仓库位置,将maven镜像更换成阿里镜像

大家都知道Maven默认连接的仓库位置https://repo .maven.apache.org/maven2访问国外镜像下载东西时相对较慢&#xff0c;所以多数朋友想切换到国内镜像&#xff0c;国内阿里已经给大家提供了一套完整的镜像供大家使用。 Maven默认连接的仓库位置 <repositories><repos…

【1++的Linux】之进程(三)

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的Linux】 文章目录 一&#xff0c;什么是进程地址空间&#xff1f;二&#xff0c;进程地址空间是怎么设计的&#xff1f;三&#xff0c;为什么要有进程地址空间&#xff1f; 一&#xff0c;什…

Parasoft Jtest 2023.1

Parasoft Jtest 2023.1 2692407267qq.com&#xff0c;更多内容请见http://user.qzone.qq.com/2692407267/

Linux系统100条命令:关于Ubuntu和 CentOS 7 相同功能的不同的终端操作命令

安装软件包&#xff1a; Ubuntu&#xff1a;apt-get install package_name CentOS 7&#xff1a;yum install package_name 更新软件包列表&#xff1a; Ubuntu&#xff1a;apt-get update CentOS 7&#xff1a;yum update 卸载软件包&#xff1a; Ubuntu&#xff1a;apt-…

制作学生查询小程序

学生个人成绩查询小程序&#xff0c;一款助力教师实时了解学生学习情况的便捷工具。本文将为您揭秘它的制作过程&#xff0c;并提供实用的建议。然而&#xff0c;简便易用的方法莫过于选择现有的工具。 许多教师都偏爱使用易查分来快速创建查分网站。与传统的独立开发方式不同…

QT-day4

画一个时钟 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPaintEvent> #include <QDebug> #include <QPainter> #include <QTimer> #include <QTime>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } Q…

Linux chmod命令——修改权限信息

我们可以使用chmod命令&#xff0c;修改文件、文件夹的权限信息。注意&#xff0c;只有文件、文件夹的所属用户或root用户可以修改。 chmod [-R] 权限 文件或文件夹 -R&#xff0c;对文件夹内的全部内容应用同样的操作 例如&#xff1a; chmod urwx,grx,ox hello.txt &…

机器学习 day35(决策树)

决策树 上图的数据集是一个特征值X采用分类值&#xff0c;即只取几个离散值&#xff0c;同时也是一个二元分类任务&#xff0c;即标签Y只有两个值 上图为之前数据集对应的决策树&#xff0c;最顶层的节点称为根节点&#xff0c;椭圆形节点称为决策节点&#xff0c;矩形节点称…

PythonWeb服务器(HTTP协议)

一、HTTP协议与实现原理 HTTP&#xff08;Hypertext Transfer Protocol&#xff0c;超文本传输协议&#xff09;是一种用于在网络上传输超文本数据的协议。它是Web应用程序通信的基础&#xff0c;通过客户端和服务器之间的请求和响应来传输数据。在HTTP协议中连接客户与服务器的…