LeetCode 21. 合并两个有序链表

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

示例 1:

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

示例 2:

输入:l1 = [], l2 = []
输出:[]

示例 3:

输入:l1 = [], l2 = [0]
输出:[0]

方法一:递归

我们可以如下递归地定义两个链表里的merge操作(忽略边界情况,比如空链表等):

[\left{ \begin{array}{ll} list1[0] + merge(list1[1:], list2) & list1[0] < list2[0] \ list2[0] + merge(list1, list2[1:]) & otherwise \end{array} \right. ]

也就是说,两个链表头部值较小的一个节点与剩下元素的merge操作结果合并。

我们直接将以上递归过程建模,同时需要考虑边界情况。

如果l1或者l2一开始就是空链表,那么没有任何操作需要合并,所以我们只需要返回非空链表。否则,我们要判断l1和l2哪一个链表的头节点的值更小,然后递归地决定下一个添加到结果里的节点。如果两个链表有一个为空,递归结束。

class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if (l1 == null) {
            return l2;
        } else if (l2 == null) {
            return l1;
        } else if (l1.val < l2.val) {
            l1.next = mergeTwoLists(l1.next, l2);
            return l1;
        } else {
            l2.next = mergeTwoLists(l1, l2.next);
            return l2;
        }
    }
}
  • 时间复杂度:O(n + m),其中n和m分别为两个链表的长度。因为每次调用递归都会去掉l1或者l2的头节点(直到至少有一个链表为空),函数mergeTwoList至多只会递归调用每个节点一次。因此,时间复杂度取决于合并后的链表长度,即O(n+m)。
  • 空间复杂度:O(n + m),其中n和m分别为两个链表的长度。递归调用mergeTwoLists函数时需要消耗栈空间,栈空间的大小取决于递归调用的深度。结束递归调用时mergeTwoLists函数最多调用n+m次,因此空间复杂度为O(n+m)。

方法二:迭代

我们可以用迭代的方法来实现上述算法。当l1和l2都不是空链表时,判断l1和l2哪一个链表的头节点的值更小,将较小值的节点添加到结果里,当一个节点被添加到结果里之后,将对应链表中的节点向后移一位。

首先,我们设定一个哨兵节点prehead,这可以在最后让我们比较容易地返回合并后的链表。我们维护一个prev指针,我们需要做的是调整它的next指针。然后,我们重复以下过程,直到l1或者l2指向了null:如果l1当前节点的值小于等于l2,我们就把l1当前的节点接在prev节点的后面同时将l1指针往后移一位。否则,我们对l2做同样的操作。不管我们将哪一个元素接在了后面,我们都需要把prev向后移一位。

在循环终止的时候,l1和l2至多有一个是非空的。由于输入的两个链表都是有序的,所以不管哪个链表是非空的,它包含的所有元素都比前面已经合并链表中的所有元素都要大。这意味着我们只需要简单地将非空链表接在合并链表的后面,并返回合并链表即可。

class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode prehead = new ListNode(-1);

        ListNode prev = prehead;
        while (l1 != null && l2 != null) {
            if (l1.val
  • 时间复杂度:O(n + m),其中n和m分别为两个链表的长度。因为每次循环迭代中,l1和l2只有一个元素会被放进合并链表中, 因此while循环的次数不会超过两个链表的长度之和。所有其他操作的时间复杂度都是常数级别的,因此总的时间复杂度为O(n+m)。
  • 空间复杂度:O(1)。我们只需要常数的空间存放若干变量。

Original: https://www.cnblogs.com/ciel717/p/16633147.html
Author: 夏尔_717
Title: LeetCode 21. 合并两个有序链表

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/599180/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MySQL事务与锁

    在关系型数据库内,事务是由一个SQL或一组SQL语句组成的逻辑处理单元。也就是说事务就相当于一个盛放SQL的容器,事务中的SQL要么全部执行成功,要么所有已经修改的操作都回滚到原来…

    数据库 2023年5月24日
    0106
  • 2022-8-15 数据库 mysql 第一天

    Mysql数据库 数据库 数据库【按照数据结构来组织、存储和管理数据的仓库】。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。 数据对于公司来说最宝贵的财…

    数据库 2023年6月14日
    082
  • 第07章 MySQL单行函数

    第07章 MySQL单行函数 1. 函数的理解 1.1 什么是函数 函数在计算机语言的使用中贯穿始终,函数的作用是什么呢?它可以把我们经常使用的代码封装起来,需要的时候直接调用即可…

    数据库 2023年5月24日
    073
  • 有趣的特性:CHECK约束

    功能说明 在MySQL 8.0.16以前, CREATE TABLE允许从语法层面输入下列 CHECK约束,但实际没有效果: CHECK (expr) 在 MySQL 8.0.16…

    数据库 2023年5月24日
    055
  • 记一次生产事故,Redis内存问题排查与解决

    前几天生产的Redis突然挂掉了,之前都没有太注意过Redis那边的使用情况,这次Redis挂掉重启后,发现在那台服务器上,Redis占用了足足30G的运行内存,这才意识到Redi…

    数据库 2023年6月6日
    091
  • 微服务架构项目浅析

    微服务架构的演变 最初的需求 业务发展后需要克服的问题 微服务架构使用的组件 Nginx Redis Rabbitmq Mysql jar jdk * 总结 ​ 这个章节主要介绍微…

    数据库 2023年6月6日
    084
  • Hbase中(java.io.IOException: Could not locate executable nullbinwinutils.exe in the Hadoop binarie)

    报错信息如下: 结合大神分析,应该为本机使用Hbase时,没有配置其环境变量。 出处:https://www.cnblogs.com/jessezeng/p/5520915.htm…

    数据库 2023年6月11日
    093
  • MySQL之外键、表关系及SQL查询关键字

    一、外键 假设我们现在有一个员工信息表,其中包含以下字段: [En] Suppose we now have an employee information table with …

    数据库 2023年5月24日
    078
  • Linux 目录

    以下是对这些目录的解释: /bin: bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。 /boot: 这里存放的是启动 Linux 时使用的…

    数据库 2023年6月6日
    0107
  • etcd和Zookeeper孰优孰劣对比

    背景 最近在看到Pachyderm的介绍时,看到作者拿YARN和Kubernetes做类比,拿Zookeeper和etcd做对比。YARN和Kubernetes的类比还相对比较好理…

    数据库 2023年6月11日
    099
  • Java List分批处理

    工作中经常遇到分批处理的问题,比如将一个List列表中的数据分批次保存至数据库中。如果列表中数据条目很大,比如1000万条以上,mysql中 max_allowed_packet …

    数据库 2023年6月14日
    0103
  • 看看 Singleflight

    在看前辈的代码时,发现了一个缓存放穿透的处理,好奇就点进去看了,发现代码意外的少,于是就研究起来,为数不多我能看明白的源码T-T 源码地址:https://cs.opensourc…

    数据库 2023年6月9日
    0124
  • 高可用 | Xenon 实现 MySQL 高可用架构 常用操作篇

    原创:知数堂 上一篇文章,我们详细介绍了 Xenon 实现 MySQL 高可用架构的部署过程。接下来本篇将介绍 Xenon 的常用操作,帮助大家在完成环境搭建之后,能把 Xenon…

    数据库 2023年5月24日
    0100
  • MySQL MHA 运行状态监控

    一 项目描述 1.1 背景 MHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了 automating master failo…

    数据库 2023年5月24日
    0132
  • python爬取博客圆首页文章链接+标题

    新人一枚,初来乍到,请多关照 来到博客园,不知道写点啥,那就去瞄一瞄大家都在干什么好了。 使用python 爬取博客园首页文章链接和标题。 首先当然是环境了,爬虫在window10…

    数据库 2023年6月11日
    0123
  • 设计模式之(12)——外观模式

    外观模式(facadePattern)又叫门面模式,隐藏了子系统的复杂实现,为子系统中的一组接口提供了一个统一的访问入口,使得子系统容易被访问或使用,说白了就是把复杂的子系统封装成…

    数据库 2023年6月14日
    085
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球