当前位置: 首页 > article >正文

leetcode21:合并两个有序列表

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

示例 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:问题定义和边界条件分析

问题描述: 我们有两个已经按升序排列的链表,任务是将它们合并成一个新的升序链表并返回。新链表由这两个链表的所有节点拼接而成。

输入输出条件

  • 输入:两个链表 l1l2
    • l1l2ListNode 节点组成,每个节点包含一个整数值和一个指向下一个节点的指针。
    • 链表 l1l2 均按非递减顺序排列。
  • 输出:一个新的链表,该链表由两个输入链表的所有节点组成,并按升序排列。

限制

  • 节点数量范围在 [0, 50] 之间。
  • 节点值范围在 [-100, 100] 之间。

边界条件

  1. l1l2 为空链表的情况。
  2. l1l2 均为空链表。
  3. 所有节点的值相等或完全相反的情况。
  4. l1l2 长度不等。

步骤2:解题思路

问题分解: 这个问题是经典的有序链表合并问题,可以用双指针的方式来高效解决。我们可以依次比较两个链表的当前节点,将较小的节点加入到新链表中,并将对应链表的指针向前移动,直到遍历完两个链表。

算法设计

  1. 创建一个虚拟头节点(dummy node)dummy,用于存放合并后的链表,这样可以简化链表操作。
  2. 使用两个指针 p1p2 指向 l1l2 的当前节点。
  3. 使用指针 curr 作为新链表的构建指针,将较小的节点连接到新链表中:
    • 如果 p1 的值小于等于 p2,将 p1 指向的节点连接到新链表,并移动 p1
    • 否则,将 p2 指向的节点连接到新链表,并移动 p2
  4. 当某个链表遍历完后,将另一个链表剩余的部分直接连接到新链表末尾。
  5. 返回 dummy->next,即合并后的链表。

复杂度分析

  • 时间复杂度:O(m + n),其中 mn 分别是 l1l2 的长度。
  • 空间复杂度:O(1),我们只需常数级空间存储指针变量。

算法设计思路:采用双指针法实现,既高效又能保持原链表的升序性质。


步骤3:详细代码实现

步骤4:算法优化和启发

  1. 链表操作优化:通过虚拟头节点简化链表操作,避免了特殊情况处理,提高了代码的简洁性和可读性。
  2. 双指针效率:该算法利用了双指针法,在每次比较时只移动其中一个指针,提高了时间效率。在合并有序链表或数组等问题中,双指针法非常高效。
  3. 内存优化:由于链表本身是动态数据结构,操作过程中我们直接在原链表上操作,保持了空间利用的最小化。

步骤5:实际应用场景

该算法在实际生活中具有广泛的应用,尤其在数据整合数据流排序等领域非常有效。例如,在实时数据分析中,可能需要将多个数据流按顺序合并并处理。可以参考以下示例:

实际应用示例:股票行情数据流合并

在金融领域,各种股票交易所提供的行情数据流可能会按照时间顺序独立传输。为了向用户显示整体行情变化,往往需要将来自多个交易所的按时间排序的行情数据合并为一个完整的时间序列。

实现方法:

  • 每个交易所的行情数据作为一个按时间升序的链表或流。
  • 使用上述链表合并算法,将各交易所数据按时间顺序合并成一个时间序列,并将结果传输给用户。

这种方法可以确保数据的实时性和有序性,有助于分析师和投资者实时跟踪所有交易所的综合行情信息。


http://www.kler.cn/a/391010.html

相关文章:

  • uniapp+vue2 设置全局变量和全局方法 (兼容h5/微信小程序)
  • 2024.11.12_大数据的诞生以及解决的问题
  • 若依笔记(八):Docker容器化并部署到公网
  • Mit6.S081-实验环境搭建
  • 小面馆叫号取餐流程 佳易王面馆米线店点餐叫号管理系统操作教程
  • 机器学习基础02_特征工程
  • [Linux]IO多路转接(上)
  • 微波无源器件 OMT1 一种用于倍频程接收机前端的十字转门四脊正交模耦合器(24-51GHz)
  • Java-03
  • SQL50题
  • ubuntu 20.04 NVIDIA驱动、cuda、cuDNN安装
  • Python 类私化有笔记
  • 【深度学习遥感分割|论文解读2】UNetFormer:一种类UNet的Transformer,用于高效的遥感城市场景图像语义分割
  • 量化交易系统开发-实时行情自动化交易-3.4.2.2.Okex交易数据
  • 从0开始搭建一个生产级SpringBoot2.0.X项目(十三)SpringBoot连接MongoDB
  • 请求接口时跨域问题详细解决方案
  • 前端开发调试之 PC 端调试
  • 使用 `RestTemplate` 获取二进制数据并返回 `byte[]`:解决方案与示例
  • Java 多态 (Polymorphism)详解
  • 智能社区服务小程序+ssm
  • MySQL数据库:SQL语言入门 (学习笔记)
  • ubuntu 20.04添加ros官方的软件源(解决下载ros软件包出现的E 无法定位软件包的问题)
  • ERP学习笔记-预处理eeglab
  • Transformer模型中的位置编码介绍
  • 群晖 Docker 容器文件夹出现未知用户 UID 1000
  • 开源TTS语音克隆神器GPT-SoVITS_V2版本地整合包部署与远程使用生成音频