leetcode21

news2025/1/11 14:26:38

题目:

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

示例 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
         */
    }
}

加油加油^_^

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

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

相关文章

腾讯mini项目-【指标监控服务重构】2023-07-21

今日已办 当在Docker容器中运行程序时&#xff0c;可能会遇到使用os.Getpid()函数时出现异常的情况。这是因为Docker容器中的进程隔离机制与宿主机器不同&#xff0c;容器内部的进程可能无法访问宿主机器的进程信息。 要解决这个问题&#xff0c;可以尝试&#xff1a; 使用do…

Linux磁盘管理:最佳实践

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

每日一博 - 防范彩虹表攻击_数据库存储密码的秘密武器

文章目录 概述图解小结 概述 加盐&#xff08;salting&#xff09;是一种安全存储数据库中密码并验证其真实性的常见方法&#xff0c;它的主要目的是增加密码的安全性&#xff0c;以防止常见的密码攻击&#xff0c;如彩虹表攻击。以下是关于如何使用加盐技术的简要介绍&#x…

计算机二级python基础题刷题笔记(三)

hello&#xff0c;看到三的小伙伴们你们已经超过30%的对手啦&#xff01;接下来也要加油呀 代码没有最好&#xff0c;只有更好&#xff0c;如果你有更好的想法答案欢迎在评论区里发表呀 1、将程序里定义好的std列表里的姓名和成绩与已经定义好的模板拼成一段话&#xff0c;显示…

我的微信公众号开通啦,来关注我吧

我的微信公众号开通啦&#xff0c;承蒙各位粉丝的厚爱&#xff0c;请大家动动手指扫码关注吧 公众号主要以Android开发技术文章为主&#xff0c;活跃度高&#xff0c;紧跟技术前沿&#xff0c;内容深度而全面&#xff0c;重要的是 私信必回&#xff01;私信必回&#xff01;私…

利用github托管个人网站

如何制作个人学术主页&#xff1f; - 知乎去年年底刚刚基于开源项目al-folio重新做了自己的个人主页。注意&#xff0c;这个开源项目很好&#xff0c;但是有个尴尬的问题…https://www.zhihu.com/question/281476526/answer/2360738062 your site可能会出现的慢一点&#xff0…

qsort函数详细讲解以及利用冒泡排序模拟实现qsort函数

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂。 目录 1.qsort函数 1.1qsort函数的参数 …

Java笔记:Arthas-Java线上异常排查

一、安装 arthas在github上有个page&#xff0c;地址是https://alibaba.github.io/arthas/。 安装的方式有好几种&#xff1a; 1.直接下载一个可以启动的jar包然后用java -jar的方式启动 2.用官方提供的as.sh脚本一键安装 3.用rpm的方式安装 本篇介绍第一种方式&#xff0c;因…

无涯教程-JavaScript - EXP函数

描述 EXP函数返回e升至数字的幂。常数e等于自然对数的底数2.71828182845904。 语法 EXP (number)争论 Argument描述Required/OptionalNumberThe exponent applied to the base e.Required Notes 要计算其他碱基的幂,请使用幂运算符(^) EXP是LN的倒数,LN是数字的自然对数…

基于SSM的汽车租赁后台管理系统

基于SSM的汽车租赁后台管理系统 介绍 包括登录、首页、客户管理、车辆管理、汽车出租、出租单管理、汽车入库、检查单管理、系统管理等功能&#xff0c;适合二次开发课程设计、毕业设计等 软件架构 SSM 运行环境 数据库 mysql 安装教程输入链接说明 端口&#xff1a;3306…

第16篇ESP32 platformio_arduino框架 wifi联网_连接WiFi热点并连接tcp server收发数据进行通讯

第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 第3篇:vscode搭建esp32 arduino开发环境 第4篇:vscodeplatformio搭建esp32 arduino开发环境 ​​​​​​第5篇:doit_esp32_devkit_v1使用pmw呼吸灯实验 第6篇:ESP32连接无源喇叭播…

BeanFactory版本的快速入门

目录 IOC原理 IOC工作步骤 开发步骤 实现代码 DI原理 DI工作步骤 IOC原理 在Spring框架中&#xff0c;IOC是通过Bean容器&#xff08;例如ApplicationContext&#xff09;来实现的。Bean容器负责管理Bean的创建、依赖关系的注入和对象的生命周期的控制。通过配置文件&am…

【软件设计师-从小白到大牛】上午题基础篇:第一章 计算机组成与体系结构

文章目录 前言章节提要一、数据的表示&#xff08;进制的转换&#xff09;1、R进制转十进制使用按权展开法2、十进制转R进制使用短除法(余数从下往上排列&#xff09;3、二进制转八进制与十六进制 二、数据的表示&#xff08;原码反码补码移码&#xff09;真题链接 三、数据的表…

国内券商有没有量化交易接口,哪家做的比较好

个人账户实现股票量化程序化自动交易&#xff0c;券商有接口&#xff0c;门槛已降低_股票程序交易接口的博客-CSDN博客 凡是开了量化交易接口的券商做的都不错&#xff0c;关键看适不适合你自己 我在用的是python语言&#xff0c;有本地客户端&#xff0c;随时修改随时调整策略…

基于Java的考编论坛网站的设计与实现(亮点:在线发布帖子、内容评论回复、购买二手物品、在线支付)

考编论坛网站 一、前言二、我的优势2.1 自己的网站2.2 自己的小程序&#xff08;小蔡coding&#xff09;2.3 有保障的售后2.4 福利 三、开发环境与技术3.1 MySQL数据库3.2 Vue前端技术3.3 Spring Boot框架3.4 微信小程序 四、功能设计4.1 主要功能描述 五、系统实现5.1 前端界面…

直方图均衡化,画出均衡化后的直方图(数字图像处理大题复习 P2)

文章目录 1. 频率2. 累计直方图3. 取整4. 得到对应关系5. 累加对应关系&#xff0c;得出结果6. 画出均衡化后的直方图 1. 频率 一般题目会给出各个灰度级的概率分布&#xff0c;如果没有给概率&#xff0c;而是给了频率&#xff0c;比如&#xff1a; 在 8x8 的图像中&#xf…

有一个有序数字序列,从小到大排序,将一个新输入的数插入到序列中,保证插入新数后,序列仍然是升序

输入描述:第一行输入一个整数(0<N<50)。第二行输入N个升序排列的整数&#xff0c;输入用空格分隔的N个整数。第三行输入想要进行插入的一个整数 输出描述:输出为一行&#xff0c;N 1个有序排列的整数 输入:5 1 6 9 22 30 8 输出:1 6 8 9 22 30 思路&am…

深入理解Kubernetes Pod调试

调试运行中的容器和Pod不像直接调试进程那么容易&#xff0c;本文介绍了通过临时容器共享命名空间的方式调试业务容器进程的方法。原文: Debugging Kubernetes Pods: Deep Dive ZanUnsplash 调试pod最简单的方法是在有问题的pod中执行命令&#xff0c;并尝试排除故障。这种方法…

TS泛型的使用

函数中使用泛型&#xff1a; function identity<T>(arg: T): T {return arg; }let result identity<number>(10); // 传入number类型&#xff0c;返回number类型 console.log(result); // 输出: 10let value identity<string>(Hello); // 传入string类型&a…

【微信小程序】scroll-view的基本使用

| scss里面的.item:nth-child(1) index.wxml <view class"scroll"> <scroll-view scroll-x><navigator url"" wx:for"{{6}}" wx:key"index" class"item"><image class"pic" src"/sta…