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

news/2025/2/27 8:03:10

合并两个有序链表

描述

将两个已按升序排列的链表合并为一个新的升序链表,并返回该链表。
示例:
输⼊: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.niftyadmin.cn/n/5869766.html

相关文章

深入探讨K8s资源管理和性能优化

#作者&#xff1a;曹付江 文章目录 前言&#xff1a;1&#xff0e;监控 Kubernetes 集群的资源利用率1.1 Prometheus1.2 Kubernetes 度量服务器1.3 Grafana1.4 自定义指标 2. 识别资源瓶颈2.1. 监控工具2.2. 性能剖析2.3 Kubernetes 事件和日志2.4. 群集自动扩展2.5. 负载测试…

Lua的table类型的增删改查操作

增: 方法一:直接赋值 local t {} -- 创建一个空表-- 添加键值对 t["name"] "Lua" -- 添加字符串键 t[1] "Hello" -- 添加数字键print(t["name"]) -- 输出: Lua print(t[1]) -- 输出: Hello 方法二:使用table.insert…

【Linux网络编程】高效I/O--select/poll服务器

目录 多路转接之select select服务器实现 获取连接 handlerEvent select服务器代码链接 select的优缺点 多路转接之poll poll服务器实现(select服务器改写) poll的优缺点 多路转接之select select的作用 I/O的本质 等 拷贝 多路转接就是通过同时等待多个文件描述…

使用 LangChain 和 Milvus 构建测试知识库

LangChain 是一个强大的框架&#xff0c;可以与向量数据库&#xff08;如 Milvus&#xff09;无缝集成&#xff0c;用于构建基于检索的增强生成&#xff08;RAG&#xff09;系统。在测试工程师的场景中&#xff0c;可以将测试资产&#xff08;如需求文档、测试用例、缺陷报告等…

现在集成大模型的IDE,哪种开发效率最高

目录 1. Visual Studio Code GitHub Copilot 2. JetBrains IDE&#xff08;IntelliJ/PyCharm等&#xff09; Copilot/Codeium 3. Cursor 4. 云IDE&#xff08;GitHub Codespaces / Replit&#xff09; 5. Amazon CodeWhisperer 效率对比与选择建议 未来趋势 1. Visual …

蓝桥杯 五子棋对弈

五子棋对弈 问题描述 “在五子棋的对弈中&#xff0c;友谊的小船说翻就翻&#xff1f;” 不&#xff01;对小蓝和小桥来说&#xff0c;五子棋不仅是棋盘上的较量&#xff0c;更是心与心之间的沟通。这两位挚友秉承着"友谊第一&#xff0c;比赛第二"的宗旨&#xff…

阿里云ack的创建与实战应用案例

阿里云ack的创建与应用案例 创建前开通ack相关服务&#xff1a;开始创建简单的魔方游戏&#xff0c;熟悉sv与clb自动注册创建部署一个nginx 服务示例&#xff1a;走不同域名访问不同svc资源&#xff1a;为什么需要 Ingress &#xff1f;创建第一个域名的 Deployment和Service。…

蓝桥杯---快速排序(leetcode第159题)最小的k个元素(剑指offer原题)

文章目录 1.题目概述2.思路分析3.代码详解 1.题目概述 这个题目只是被包装了一下&#xff0c;本质上依然是使用的我们的快速排序算法&#xff0c;为什么这样说呢&#xff1f;因为仔细阅读题目你就会发现&#xff0c;这个需要我们去找到最小的前K个元素&#xff0c;并且进行返回…