首页 > 编程语言 >LeetCode-21. 合并两个有序链表(Java)

LeetCode-21. 合并两个有序链表(Java)

时间:2023-08-25 10:07:08浏览次数:43  
标签:ListNode 21 复杂度 next 链表 l2 l1 Java

这是我在51CTO博客开启的写作之路,第一次正式写博客记录我在LeetCode的刷题日,希望能帮助更多的小伙伴攻面自己心仪的公司offer。

如下对于 LeetCode-21. 合并两个有序链表,进行全面解析并小结解题思路,同学们请参考:

1.题目描述

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

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

2.思路分析

解题思路 :链表、递归等

这道题我使用递归实现,新链表也不需要构造新节点,我们下面列举递归三个要素。

终止条件:两条链表分别名为 l1 和 l2,当 l1 为空或 l2 为空时结束。

返回值:每一层调用都返回排序好的链表头。

本级递归内容:如果 l1 的 val 值更小,则将 l1.next 与排序好的链表头相接,l2 同理 O(m+n),m 为 l1的长度,n 为 l2 的长度。

3.算法实现

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if(l1 == null) {
            return l2;
        }
        if(l2 == null) {
            return l1;
        }

        if(l1.val < l2.val) {
            l1.next = mergeTwoLists(l1.next, l2);
            return l1;
        } else {
            l2.next = mergeTwoLists(l1, l2.next);
            return l2;
        }
    }
}

如下是算法运行提交截图:

LeetCode-21. 合并两个有序链表(Java)_Java

4.复杂度分析

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

空间复杂度:O(1)。我们只需要常数的空间存放若干变量。

5.小结

其实你们只需要把握一个技巧,就是准备一个虚拟头结点dummy,然后双指针指向list1和list2的表头对两个链表进行归并即可。

标签:ListNode,21,复杂度,next,链表,l2,l1,Java
From: https://blog.51cto.com/u_16017663/7226283

相关文章

  • LeetCode-24. 两两交换链表中的节点(Golang)
    一、前言作者:bug菌博客:CSDN、掘金、infoQ、51CTO等简介:CSDN/阿里云/华为云/51CTO博客专家,博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者,全网粉丝合计10w+,硬核微信公众号「猿圈奇妙屋」,免费领取简历模板/学习资料/大厂面试真题/职业规划......
  • Java设计模式
    装饰器模式:装饰器模式是指在不改变现有对象结构的情况下,动态的给改对象增加一些职责(即增加其额外功能)的模式。装饰器模式通常在以下几种情况使用。当需要给一个现有类添加附加职责,而又不能采用生成子类的方法进行扩充时。例如,该类被隐藏或者该类是终极类或者采用继承方式会产生......
  • Java的三大版本
    Java的三大版本WriteOnce、RunAnywhere一次编译,到处运行JavaSE标准版(桌面程序,控制台开发),这是学习Java的基础,必须牢固掌握。JavaME嵌入式开发(手机,小家电),这个现在基本上没有人再使用,可以忽略,但是要知道有这个版本。JavaEEE企业级开发(web端,服务器开发),学习这个版本之前先要......
  • CentOS7.9搭建开发环境(Java、MySQL、Nginx、Redis)
    系统使用的阿里云CentOS7.964位SCC版。先安装个文件上传下载工具lrzsz,xshell登录终端,运行下面的命令:yuminstall-ylszrz 这是因为yum源的问题,需要修改yum配置。执行以下命令:cd/etc/yum.repos.dmvCentOS-Base.repoCentOS-Base.repo.backupwgethttp://mirrors.......
  • Java的第一课,特性和优势
    Java的特性和优势简单性面向对象可移植性高性能分布式动态性多线程安全性健壮性以上特性和优势会在以后的博客中逐一展示,尽请期待! ......
  • Java流程控制if选择结构
    if选择结构单选择结构:编程中很多时候需要去判断一个东西是否可行,然后我们才去执行,这样一个过程用if语句来表示,语法:if(布尔表达式){//如果条件成立,将执行的语句}例:packageshuct;importjava.util.Scanner;publicclassIfDemo01{publicstaticvoidmain(Str......
  • TypeScript(TS)JavaScript(JS)中的所有循环方法
    for循环:for(leti=0;i<array.length;i++){//循环体}for…of循环:for(constelementofarray){//循环体}forEach方法:array.forEach((element)=>{//循环体});map方法:constnewArray=array.map((element)=>{//对......
  • java基础数据类型-int类型-day02
    目录1.变量的命名2.常量3.变量4.进制4.1进制转换4.2整型数据类型1.变量的命名记住一点:不可以以数字开头类名:首字母大写的驼峰体变量名,方法名:首字母小写的驼峰体包的名字:与python语言一样全部小写2.常量整形:123实数型:3.14字符:‘a’字符串:"abc"布尔值:truefalse......
  • 《深入理解Java虚拟机》读书笔记:方法调用
      方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程。在程序运行时,进行方法调用是最普遍、最频繁的操作,但前面已经讲过,Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件......
  • Tomcat与JavaWeb开发
    安装Tomcat&JDK安装时候选择tomcat软件版本要与程序开发使用的版本一致。jdk版本要进行与tomcat保持一致。准备2个linux虚拟机,一个运行nginx进行负载均衡一个用来运行tomcat第一步:安装JDKJDK官网地址:https://www.oracle.com/java/technologies/downloads/##下载JDK......