JavaScript算法-合并两个有序链表

news/2025/3/4 5:05:49/

合并两个有序链表

描述

将两个已按升序排列的链表合并为一个新的升序链表,并返回该链表。
示例:
输⼊:1->3->5, 2->4->6
输出:1->2->3->4->5->6

前置知识

思路

使⽤递归的方式来实现,将两个链表头部较⼩的⼀个与剩下的元素合并,并返回排好序的链表
头,当两条链表中的⼀条为空时终⽌递归。

关键点

  • 掌握链表数据结构
  • 考虑边界情况

代码

javascript">const mergeTwoLists = function (l1, l2) {if (l1 === null) {return l2;}if (l2 === null) {return l1;}if (l1.val < l2.val) {l1.next = mergeTwoLists(l1.next, l2);return l1;} else {l2.next = mergeTwoLists(l1, l2.next);return l2;}
}

解释

1、基础情况‌:
如果l1是null(即空链表),那么函数直接返回l2。因为没有什么可以与空链表合并,所以结果就是另一个链表
同样,如果l2是null,函数返回l1。
2、递归情况‌:
比较l1和l2当前节点的值(l1.val和l2.val)。

  • 如果l1.val小于l2.val,那么l1的当前节点应该在新合并链表的当前位置。为了完成合并,我们需要递归地合并l1的剩余部分(即l1.next)和l2。这通过调用mergeTwoLists(l1.next, l2)实现,并将返回的链表设置为l1.next。最后,返回l1,因为现在l1是新合并链表的头节点。
  • 如果l2.val小于或等于l1.val,那么l2的当前节点应该在新合并链表的当前位置。同样地,我们需要递归地合并l1和l2的剩余部分(即l2.next)。这通过调用mergeTwoLists(l1, l2.next)实现,并将返回的链表设置为l2.next。最后,返回l2,因为现在l2是新合并链表的头节点。
  • 这个递归过程会一直进行,直到达到基础情况之一(即一个链表为空)。在这一点上,递归开始“解开”,将每个步骤中确定的节点链接起来,形成最终合并的链表

复杂度分析

M、N 是两条链表 l1、l2 的⻓度
时间复杂度:O(M + N),每个节点都只被访问一次,并且每次递归调用都会处理一个节点
空间复杂度:O(M + N),在最坏的情况下(当链表完全不平衡时),因为递归调用栈的深度可能达到M + N

扩展

使⽤迭代的⽅式,代码如下:

javascript">function mergeTwoLists (l1, l2) {constprehead = new ListNode(-1);let prev = prehead;while (l1 != null && l2 != null) {if (l1.val <= l2.val) {prev.next = l1;l1 = l1.next;} else {prev.next = l2;l2 = l2.next;}prev = prev.next;}prev.next = l1 === null ? l2 : l1;return prehead.next;
}

http://www.ppmy.cn/news/1576184.html

相关文章

《Llama 3.2-Vision:开启多模态AI新时代》:此文为AI自动生成

Llama 3.2-Vision 是什么 在人工智能的快速发展进程中&#xff0c;多模态技术成为了推动行业变革的关键力量。Llama 3.2-Vision 作为 Meta 公司推出的新一代多模态大语言模型&#xff0c;以其卓越的视觉与语言融合能力&#xff0c;为 AI 领域带来了全新的突破。它的出现&#…

2025-03-01 学习记录--C/C++-C语言 整数类型对比

C语言 整数类型对比 类型位数范围&#xff08;有符号&#xff09;范围&#xff08;无符号&#xff09;格式化符号char8-128 到 1270 到 255%c 或 %hhdshort16-32,768 到 32,7670 到 65,535%hdint32-2,147,483,648 到 2,147,483,6470 到 4,294,967,295%dlong32 或 64-2,147,483…

Python 实战:构建分布式文件存储系统全解析

Python 实战&#xff1a;构建分布式文件存储系统全解析 在当今数据爆炸的时代&#xff0c;分布式文件存储系统凭借其高可扩展性、高可靠性等优势&#xff0c;成为了数据存储领域的热门选择。本文将详细介绍如何使用 Python 构建一个简单的分布式文件存储系统。从系统架构设计&…

【Python爬虫(55)】Scrapy进阶:深入剖析下载器与下载中间件

【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取,还涉及数据处理与分析。无论是新手小白还是进阶开发…

卷积神经网络(cnn,类似lenet-1,八)

我们第一层用卷积核&#xff0c;前面已经成功&#xff0c;现在我们用两层卷积核&#xff1a; 结构如下&#xff0c;是不是很想lenet-1&#xff0c;其实我们24年就实现了sigmoid版本的&#xff1a; cnn突破九&#xff08;我们的五层卷积核bpnet网络就是lenet-1&#xff09;-CS…

CentOS vs Ubuntu - 常用命令深度对比及最佳实践指南20250302

CentOS vs Ubuntu - 常用命令深度对比及最佳实践指南 引言 在 Linux 服务器操作系统领域&#xff0c;CentOS 和 Ubuntu 是广泛采用的发行版。它们在命令集、默认工具链及生态系统方面各有特点。本文深入剖析 CentOS 与 Ubuntu 在常用命令层面的异同&#xff0c;并结合实践案例…

昼夜掘金者(BTC)交易的智能领航者

在瞬息万变的比特币&#xff08;BTC&#xff09;交易领域&#xff0c;“昼夜掘金者” 智能交易策略横空出世&#xff0c;为投资者指明方向。 智能交易&#xff0c;双重模式捕捉机遇 “昼夜掘金者” 支持随机与挂单做单。随机做单如灵活猎手&#xff0c;迅速抓住市场闪现的机会&…

ArcGIS Pro可见性分析:精通地形视线与视域分析

在地理信息系统&#xff08;GIS&#xff09;的广泛应用中&#xff0c;可见性分析作为一项关键技术&#xff0c;发挥着不可替代的作用。 无论是城市规划、环境监测&#xff0c;还是军事侦察、景观设计&#xff0c;可见性分析都能提供精确的数据支持&#xff0c;帮助我们更好地理…