算法的学习笔记—合并两个排序的链表(牛客JZ25)

news2024/11/14 12:02:25

img

😀前言
在算法面试中,链表问题是经常遇到的考点之一,其中合并两个排序链表是一个非常经典的问题。本文将详细介绍如何通过递归和迭代两种方式实现两个有序链表的合并。

🏠个人主页:尘觉主页

文章目录

  • 😀合并两个排序的链表
    • 😉题目描述
      • 示例1
      • 示例2
      • 示例3
    • 🤔解题思路
      • 🥰递归解法
        • 递归解法的分析
      • 🥰迭代解法
        • 迭代解法的分析
    • 😄总结

😀合并两个排序的链表

NowCoder

😉题目描述

输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。

数据范围: 0≤n≤1000,−1000≤节点值≤1000
要求:空间复杂度 O(1),时间复杂度 O(n)

如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6},转换过程如下图所示:

img

或输入{-1,2,4},{1,3,4}时,合并后的链表为{-1,1,2,3,4,4},所以对应的输出为{-1,1,2,3,4,4},转换过程如下图所示:

img

示例1

  • 输入{1,3,5}{2,4,6}
  • 输出{1,2,3,4,5,6}

示例2

  • 输入{}{}
  • 输出{}

示例3

  • 输入{-1,2,4}{1,3,4}
  • 输出{-1,1,2,3,4,4}

🤔解题思路

要实现两个排序链表的合并,可以使用递归和迭代两种方法。下面分别详细讲解这两种方法的实现思路和代码。

🥰递归解法

递归解法的核心思想是比较两个链表的头节点值,并通过递归调用合并剩余部分的链表。具体而言:

  1. 如果 list1 的头节点值小于等于 list2 的头节点值,则 list1 的头节点应成为新链表的头节点,并递归合并 list1 的剩余部分和 list2
  2. 反之,则 list2 的头节点成为新链表的头节点,并递归合并 list1list2 的剩余部分。

递归解法的代码实现如下:

public ListNode Merge(ListNode list1, ListNode list2) {
    if (list1 == null)
        return list2;
    if (list2 == null)
        return list1;
    if (list1.val <= list2.val) {
        list1.next = Merge(list1.next, list2);
        return list1;
    } else {
        list2.next = Merge(list1, list2.next);
        return list2;
    }
}
递归解法的分析
  • 时间复杂度O(n)。每次递归都会遍历一个节点,最终遍历完所有节点,因此时间复杂度为 O(n)
  • 空间复杂度O(n)。由于递归调用占用了系统栈空间,递归深度为 n,空间复杂度为 O(n),不满足题目对 O(1) 空间复杂度的要求。

虽然递归解法简单直观,但在处理深度较大的链表时,可能会出现栈溢出的风险,因此在实际应用中通常更倾向于使用迭代解法。

🥰迭代解法

迭代解法通过维护一个指针逐步遍历两个链表,并根据节点值的大小将节点连接到新链表的末尾。具体实现步骤如下:

  1. 创建一个虚拟头节点 head,用于存储合并后的链表。
  2. 使用 cur 指针遍历 list1list2,将较小值的节点链接到 cur 后面,然后移动 cur 和相应链表的指针。
  3. 如果一个链表遍历完了,直接将另一个链表剩余部分链接到 cur 后面。
  4. 最后返回 head.next,即合并后的链表的头节点。

迭代解法的代码实现如下:

public ListNode Merge(ListNode list1, ListNode list2) {
    ListNode head = new ListNode(-1);
    ListNode cur = head;
    while (list1 != null && list2 != null) {
        if (list1.val <= list2.val) {
            cur.next = list1;
            list1 = list1.next;
        } else {
            cur.next = list2;
            list2 = list2.next;
        }
        cur = cur.next;
    }
    if (list1 != null)
        cur.next = list1;
    if (list2 != null)
        cur.next = list2;
    return head.next;
}
迭代解法的分析
  • 时间复杂度O(n)。同样,迭代过程中会遍历所有节点,因此时间复杂度为 O(n)
  • 空间复杂度O(1)。只使用了常量级别的额外空间,满足题目对 O(1) 空间复杂度的要求。

迭代解法不仅在时间和空间复杂度上更加符合题目的要求,还避免了递归深度过大的问题,因此在实际开发中更为常用。

😄总结

合并两个排序链表问题通过递归和迭代两种方法均可以有效解决。递归解法简单直观,但在空间复杂度上有所不足;迭代解法在时间和空间效率上更为优越,是实际应用中的首选方案。

希望通过本文的详细讲解,大家能够掌握这两种合并排序链表的技巧,并在算法面试或实际开发中灵活运用。

😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

img

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

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

相关文章

大厂高频软件测试面试题和答案都帮你准备好啦,备战金九银十

还有两周时间就是金九银十求职招聘季了&#xff0c;每年的9月和10月&#xff0c;都是毕业生求职的大好时机&#xff0c;很多企业为招揽人才&#xff0c;会在每年的九十月份举办针对应届生的招聘会。接下来小编已为大家备好了多家大厂高频软件测试面试题和答案&#xff0c; 说下…

Zookeeper应用场景实战一

目录 1. Zookeeper Java客户端实战 1.1 Zookeeper 原生Java客户端使用 ZooKeeper常用构造器 示例代码&#xff1a; Zookeeper主要方法 1.2 Curator开源客户端使用 引入依赖 示例代码&#xff1a; 创建一个客户端实例 创建节点 一次性创建带层级结构的节点 获取数据 …

RTC时钟测试

1. 基础知识 Linux 的系统时间有时跟硬件时间是不同步的。 Linux时钟分为系统时钟(System Clock)和硬件(Real Time Clock&#xff0c;简称RTC)时钟。系统时钟是指当前Linux Kernel中的时钟&#xff0c;而硬件时钟则是主板上由电池供电的时钟&#xff0c;这个硬件时钟可以在BIO…

编译aws并访问minio

Aws amazon (S3) 是一个公开的服务&#xff0c;Web 应用程序开发人员可以使用它存储数字资产&#xff0c;包括图片、视频、音乐和文档。 S3 提供一个 RESTful API 以编程方式实现与该服务的交互. MinIO是兼容AWS SDK,所以可以通过aws访问minio文件系统。 指导文档&#xff1…

CSS知识点详解:display+float

display&#xff1a;浮动 1.block&#xff1a;使元素呈现为块级元素&#xff0c;可设置宽高 display: block; 特点&#xff1a;使元素呈现为块级元素&#xff0c;即该元素会以新行开始&#xff0c;占据整行的宽度&#xff0c;即使其宽度未满。 例子&#xff1a; 2.inline&a…

队列(笔记)

文章目录 1. 概念2. 实现方式3. 复杂度其他 4. 实际应用5. 内容出处 1. 概念 队列&#xff1a;其实就是排队。像我们在银行窗口取钱、车站买车票等都可以叫队列。 特点&#xff1a;队列只允许在后端(rear)进行插入操作&#xff0c;在前端(front)进行删除操作(即先进先出…

算法刷题记录 八十五【图论的广度优先搜索理论基础】

前言 图论章节第2篇。 第1篇&#xff1a;记录 八十二【图论理论基础及深度优先搜索算法】&#xff1b; 本文&#xff1a;记录 八十五【图论的广度优先搜索理论基础】 一、广度优先搜索理论基础 广度优先搜索理论基础 参考链接 1.1 知识点框架 1.2 模拟广度搜索的过程 在有向…

Llama 3.1深度解析:405B、70B及8B模型的多语言与长上下文处理能力

Llama 3.1 发布了&#xff01;今天我们迎来了 Llama 家族的新成员 Llama 3.1 进入 Hugging Face 平台。我们很高兴与 Meta 合作&#xff0c;确保在 Hugging Face 生态系统中实现最佳集成。Hub 上现有八个开源权重模型 (3 个基础模型和 5 个微调模型)。 Llama 3.1 有三种规格: …

字符串拼接和反转

定义一个方法&#xff0c;把int数组中的数据按照指定的格式拼接成一个字符串 调用该方法&#xff0c;并在控制台输出结果 例如&#xff1a; 数组为 int[] arr [1,2,3]; 执行方法后的输出结果为:[1,2,3] package stringdemo;public class StringDemo3 {public static void…

洋牡丹:多彩花语与深邃寓意

一、洋牡丹概述 洋牡丹&#xff0c;学名为花毛茛&#xff0c;其名称的由来颇为有趣。因花型酷似牡丹花&#xff0c;且从国外引入栽培&#xff0c;故得 “洋牡丹” 这一亲切的称呼。 洋牡丹的常见品种繁多&#xff0c;有单瓣和重瓣之分。单瓣的洋牡丹清新雅致&#xff0c;花瓣舒…

docker 最新可用镜像源地址

无论是docker桌布版本&#xff0c;还是linux版本通用 直接更换镜像源地址即可&#xff1a;亲测目前可用 { "registry-mirrors": ["https://0c105db5188026850f80c001def654a0.mirror.swr.myhuaweicloud.com","https://5tqw56kt.mirror.aliyuncs.com&…

大模型基于指令的知识编辑:InstructEdit技术

人工智能咨询培训老师叶梓 转载标明出处 在知识更新和编辑方面&#xff0c;大模型在特定任务上表现出色&#xff0c;但在面对不同任务时往往力不从心&#xff0c;需要为每个任务单独设计编辑器&#xff0c;这在一定程度上限制了其应用范围。为了解决这一问题&#xff0c;浙江大…

二十二、状态模式

文章目录 1 基本介绍2 案例2.1 Season 接口2.2 Spring 类2.3 Summer 类2.4 Autumn 类2.5 Winter 类2.6 Person 类2.7 Client 类2.8 Client 类的运行结果2.9 总结 3 各角色之间的关系3.1 角色3.1.1 State ( 状态 )3.1.2 ConcreteState ( 具体的状态 )3.1.3 Context ( 上下文 )3.…

【ARM+Codesys 客户案例 】 基于RK3568/A40i/STM32+CODESYS开发AGV运动控制器,支持国产定制

在过去&#xff0c;步科更多的是为AGV客户提供单一、高性能的低压伺服核心部件产品&#xff0c;而现在&#xff0c;步科基于 CODESYS 开发了一款面向AGV机器人的特种控制器 - 青龙1号&#xff0c;开始提供以步科AGV运动控制器FD1X4S系列低压伺服Green系列HMI等为核心的AGV总线控…

keepalived理论--实验

一 . 高可用集群 1.1 集群类型 LB &#xff1a; Load Balance 负载均衡 LVS/HAProxy/nginx &#xff08; http/upstream, stream/upstream &#xff09; HA &#xff1a; High Availability 高可用集群 数据库、 Redis SPoF: Single Point of Failure &#xff0c;解决…

2004-2023华为杯数学建模优秀参考论文

笔者整理了2004-2023年华为杯研究生数学建模全部优秀论文和赛题&#xff0c;内容齐全&#xff0c;适合将要参加建模比赛的朋友学习使用。 免费优秀论文获取联系&#xff1a; 建模忠哥小师妹 2004-2023历届华为杯研究生数学建模优秀论文合集&#xff1a;

【数学分析笔记】第2章第1节实数系的连续性(2)

2. 数列极限 2.1 实数系的连续性 2.1.3 确界存在定理 【定理2.1.1】&#xff08;确界存在定理——实数系连续性定理&#xff09;非空有上界的数集必有上确界&#xff0c;非空有下界的数集必有下确界。 【证】&#xff08;写了一些我自己的理解&#xff0c;欢迎数院大神批评指…

Linux基础知识学习(二)

一. 常用基本命令 1. 目录管理 1> 绝对路径、相对路径 绝对路径路径的全称&#xff1a;C:\ProgramData\360safe\xxx.xx 比如说 360safe 目录下&#xff0c;那这个 xxx.xx 文件&#xff0c;对应我们的相对配置就 /xxx.xx cd &#xff1a; 切换目录命令&#xff01; ./ &…

【html+css 绚丽Loading】-000001 双极乾坤盘

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽Loading&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495…

【信创】麒麟打包工具初体验

往期好文&#xff1a;关于信创系统&#xff08;麒麟、统信、中科方德&#xff09;的10个问题与答复&#xff08;二&#xff09; Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于麒麟桌面操作系统上麒麟打包工具的介绍与使用的文章。麒麟打包工具是一款专门为麒麟…