leetcode21合并两个有序链表

2023-09-17 17:00:41

题目:

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

示例 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;
        }
        else
            this.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->4
        1->3->4
        1->1->2->3->4->4
        hello 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;
        }
        else
            this.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->4
        1->3->4
        hello list
        下面的链表要倒着看
         ->4->4->3->2->1->1
         */
    }
}

加油加油^_^

更多推荐

基于PyTorch搭建FasterRCNN实现目标检测

基于PyTorch搭建FasterRCNN实现目标检测1.图像分类vs.目标检测图像分类是一个我们为输入图像分配类标签的问题。例如,给定猫的输入图像,图像分类算法的输出是标签“猫”。在目标检测中,我们不仅对输入图像中存在的对象感兴趣。我们还对它们在输入图像中的位置感兴趣。从这个意义上说,目标检测超越了图像分类。1.1图

Java实现敏感日志脱敏

一、前言在实际项目中,可能需要对日志中的一些敏感数据脱敏,比如使用遮掩算法,只显示部分数据。二、具体实现1.首先定义一个工具类,对常见的一些敏感数据脱敏publicclassDesensitizedUtils{/***【中文姓名】只显示第一个汉字,其他隐藏为2个星号,比如:李***/publicstaticString

Ubuntu 20.04中Nightingale二进制部署

参考博客《【夜莺监控】初识夜莺,强!》lsb_release-r可以看到操作系统版本是20.04,uname-r可以看到内核版本是5.5.19。sudoapt-getupdate进行更新镜像源。完成之后,如下图:sudoapt-getupgrade更新软件。MySQL安装参考博客《Ubuntu20.04安装MySQL8

Mojo编程语言是AI人工智能的新的编程语言

Mojo是ChrisLattner的创业公司Modular开发的一种新的编程语言,旨在统一AI基建和异构计算。Mojo被认为是Python的超集,兼容Python生态,但添加了系统编程和编译期优化的特性,以提高性能和部署效率。Mojo基于MLIR,可以支持多种硬件加速器,包括CPU、GPU和其他xPU。Mojo编程语言

Node.js环境安装与服务设置,结合内网穿透随时随地公网访问!

文章目录前言1.安装Node.js环境2.创建node.js服务3.访问node.js服务4.内网穿透4.1安装配置cpolar内网穿透4.2创建隧道映射本地端口5.固定公网地址前言Node.js是能够在服务器端运行JavaScript的开放源代码、跨平台运行环境。Node.js由OpenJSFoundation(原为

flutter产物以aar形式嵌入android原生工程

以前做的项目中,flutter都是作为module嵌入原生工程中,新公司项目却是以aar形式嵌入android工程,这种优点是原生工程不必配置flutter环境也能跑了,这里记录一下简单步骤。创建一个fluttermodule通过androidstudio创建一个fluttermodule,注意不要创建成flutter

KMP算法

卡尔老师视频链接KMP算法:KMP算法,全称为Knuth-Morris-Pratt算法,是一种用于字符串匹配的高效算法。它的主要思想是利用已经匹配过的字符信息,避免不必要的回溯,从而提高匹配的效率。KMP算法的核心是构建一个辅助数组next,用来记录模式串中每个字符对应的最长公共前缀和后缀的长度。通过这个数组,可以在匹

(二十七)mmdetection实用工具: Visualization

目录一、基础绘制接口二、基础存储接口三、任意点位进行可视化一、基础绘制接口可视化器(Visualizer):可视化器负责对模型的特征图、预测结果和训练过程中产生的结构化日志进行可视化,支持Tensorboard和WanDB等多种可视化后端。importtorchimportmmcvfrommmengine.visual

口袋参谋:新品上架如何做市场调查?这个方法超实用

很多商家在新品上架之前,都会对宝贝的市场行情进行调查分析,只有了解指定关键词下的行业市场数据,了解消费者需求,才能针对性的进行卖货。可是我们要是人工一点点去搜集,一点点去翻找,很多数据是没法进行人工去统计的,如果你要这样做的话,新品上架那是遥遥无期了。​那还有更好的办法吗?有些商家会专门去购买生意参谋里的市场洞察,对于

Linux cp命令使用指南:详细教程及实际应用场景解析

文章目录Linux中的cp命令使用指南1.简介1.1Linux操作系统简介1.2文件系统和目录结构1.3cp命令概述2.cp命令基本用法2.1复制文件2.2复制目录2.3复制多个文件或目录2.4递归复制2.5强制覆盖已存在文件2.6保留文件权限和属性3.高级用法3.1保留符号链接3.2仅复制更新的文件3.3拷贝到远程主

【Redis】深入理解 Redis 持久化机制 —— RDB 和 AOF

文章目录一、Redis的持久化二、RDB持久化机制2.1对RBD的认识RDB的概念RDB持久化机制的优缺点RDB的相关配置2.2RDB的触发时机2.2RDB的触发时机自动触发手动触发:SAVE和BGSAVE2.3RDB文件的处理保存RDB文件压缩RDB文件校验RDB文件三、AOF持久化机制3.1对AOF的认识AOF的概

热文推荐