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

😀前言
在算法面试中,链表问题是经常遇到的考点之一,其中合并两个排序链表是一个非常经典的问题。本文将详细介绍如何通过递归和迭代两种方式实现两个有序链表的合并。
🏠个人主页:尘觉主页
文章目录
- 😀合并两个排序的链表
- 😉题目描述
- 示例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},转换过程如下图所示:

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

示例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}
🤔解题思路
要实现两个排序链表的合并,可以使用递归和迭代两种方法。下面分别详细讲解这两种方法的实现思路和代码。
🥰递归解法
递归解法的核心思想是比较两个链表的头节点值,并通过递归调用合并剩余部分的链表。具体而言:
- 如果
list1的头节点值小于等于list2的头节点值,则list1的头节点应成为新链表的头节点,并递归合并list1的剩余部分和list2。 - 反之,则
list2的头节点成为新链表的头节点,并递归合并list1和list2的剩余部分。
递归解法的代码实现如下:
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)空间复杂度的要求。
虽然递归解法简单直观,但在处理深度较大的链表时,可能会出现栈溢出的风险,因此在实际应用中通常更倾向于使用迭代解法。
🥰迭代解法
迭代解法通过维护一个指针逐步遍历两个链表,并根据节点值的大小将节点连接到新链表的末尾。具体实现步骤如下:
- 创建一个虚拟头节点
head,用于存储合并后的链表。 - 使用
cur指针遍历list1和list2,将较小值的节点链接到cur后面,然后移动cur和相应链表的指针。 - 如果一个链表遍历完了,直接将另一个链表剩余部分链接到
cur后面。 - 最后返回
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连支持一下,创造不易您们的支持是我的动力🤞

相关文章:
算法的学习笔记—合并两个排序的链表(牛客JZ25)
😀前言 在算法面试中,链表问题是经常遇到的考点之一,其中合并两个排序链表是一个非常经典的问题。本文将详细介绍如何通过递归和迭代两种方式实现两个有序链表的合并。 🏠个人主页:尘觉主页 文章目录 😀合并…...
《虚拟之旅:开启无限可能的机器世界》简介:
1.Ubonto的介绍: Ubuntu 是一个流行的开源操作系统,基于 Linux 内核。 它具有以下一些特点和优势: 开源免费:任何人都可以免费使用、修改和分发。丰富的软件库:通过软件包管理器可以方便地安装各种应用程序。良好的…...
centos7 服务器搭建
1. 查看 centos 版本 cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)2 .查看 ip地址 ip addr sudo yum install net-tools -y 3. 是否能够上网 ping www.baidu.com ping 114.114.114.114 sudo systemctl restart network 4. DNS 更新DNS配置 编辑/etc/r…...
【Godot4自学手册】第四十五节用着色器(shader)制作水中效果
本节内容,主要学习利用着色器制作水波纹效果,效果如下: 一、搭建新的场景 首先我们新建场景,根节点选择Node2D,命名为Water,给根节点添加两个Tilemap节点,一个命名为Background主要用于绘制地…...
VMware Workstation Pro 安装 Ubuntu Server
这里写目录标题 VMware Workstation Pro 安装 Ubuntu Server1. 启动选项2. 系统语言3. 安装程序升级4. 键盘配置5. 安装类型6. 网卡配置7. 代理配置8. 系统镜像配置9. 硬盘配置10. 账户配置11. Ubuntu Pro 版本12. SSH 服务13. 推荐软件14. 安装成功15. 第一次重启报错16. 登录…...
智能化包括自动化与非自动化
智能化通常指的是系统或设备具备智能功能,以提高其自主性和效率。智能化可以分为自动化与非自动化两大类,每一类都有其独特的特点和应用场景。 一、自动化 自动化指的是系统能够在无需人为干预的情况下完成任务或操作。自动化系统通常依赖于预设的规则、…...
微前端架构的容器化部署:策略、实践与优势
随着微服务架构的兴起,微前端架构也成为现代Web应用开发的热门趋势。容器化技术,以其轻量级、可移植性和易于管理的特点,成为微前端部署的理想选择。本文将详细介绍微前端架构下应用容器化部署的策略、实践步骤以及这一方法的优势。 容器化技…...
面试题(网络、js、框架)
自我介绍 您好,面试官!我叫[您的姓名],非常荣幸能有机会参加这次面试。 在过去的 3 年里,我一直专注于前端开发领域,积累了丰富的实践经验。 在 Vue.js 项目中,我能够熟练运用组件化开发模式,实…...
C语言典型例题40
《C程序设计教程(第四版)——谭浩强》 题目 例题3.8 运输公司对用户计算运费。路程(以s表示,单位为千米),吨/千米运费越低。标准如下: s<250 没…...
【大模型部署及其应用 】使用 Ollama 和 Ollama WebUI 在本地运行 Llama 3
使用 Ollama 和 Ollama WebUI 在本地运行 Llama 3 目录 开始使用 Llama 3设置 Ollama WebUI访问 Ollama WebUI使用 Docker GenAI Stack 的 Llama 3骆驼 2 与 骆驼 3...
uniapp-部分文件中文乱码
一、问题 在开发时遇到,部分页面的中文显示乱码,如图 搜索了一下解决方法,这里记录一下 二、问题原因: 页面的编码格式不是 utf-8 造成的 三、解决方法 打开出现乱码页面选择编译器左上角的文件 > 以指定编码重新打开 选择U…...
Day41 | 647. 回文子串 516.最长回文子序列
语言 Java 647. 回文子串 回文子串 题目 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 思路 动规五部曲来分析 1.dp数组的含义&#x…...
全面解析Gerapy分布式部署:从环境搭建到定时任务,避开Crawlab的坑
Gerapy分布式部署 搭建远程服务器的环境 装好带docker服务的系统 Docker:容器可生成镜像,也可拉去镜像生成容器 示例:将一个环境打包上传到云端(远程服务器),其他8个服务器需要这个环境直接向云端拉取镜像生成容器,进而使用该环境,比如有MYS…...
Springboot项目中使用druid实现多数据源和动态数据源,因数据库不可用导致的项目挂起的处理方案
Springboot项目中使用druid因数据库不可用导致的项目挂起的处理方案 在Spring Boot项目中使用Druid实现多数据源和动态数据源管理是一个常见的场景。通过合理的配置和错误处理机制,您可以有效地管理数据源,避免因数据库不可用而导致整个项目挂起。 1.…...
多线程 03:知识补充,静态代理与 Lambda 表达式的相关介绍,及其在多线程方面的应用
一、概述 记录时间 [2024-08-16] 前置知识:Java 基础篇;Java 面向对象 多线程 01:Java 多线程学习导航,线程简介,线程相关概念的整理 多线程 02:线程实现,创建线程的三种方式,通过多…...
机器学习中的距离概念
距离在机器学习中应用广泛,包括欧式距离、曼哈顿距离、内积距离和KL距离。 下面总结一下。 机器学习中的距离 欧式距离曼哈顿距离内积距离KL距离距离作为损失函数(MSE/MAE...)欧式距离与内积距离的联系☆距离的有效性 欧式距离 欧式距离(Euclidean Dis…...
Java 如何判断map为null或者空
1.示例一 在Java中,如果我们想判断一个Map是否为null或者空(即没有任何键值对),我们可以使用以下的方法。下面是一个完整的示例代码,展示了如何进行这样的判断: import java.util.HashMap; import java…...
终端用户视角下的性能测试,体验与度量的融合
传统的性能测试的度量标准是什么 响应时间(Response Time): 这是从客户端发出请求到接收到完整响应所需的时间。响应时间是衡量系统性能的重要指标,特别是在面向用户的应用中,因为它直接影响用户体验。 而用户体验的度…...
KCP源码解析系列(二)KCP协议结构体
一、KCP协议包 1.1 kcp协议包 kcp中只有一种数据包,不管是数据还是控制信息,都用这个数据包来表示 0 4 5 6 8 (BYTE) ---------------------------- | conv |cmd|frg| wnd | ---------------------------- 8 | …...
微软运行库全集合:一站式解决兼容性问题
开发者在部署应用程序时经常遇到因缺少运行库而引发的兼容性问题。为了解决这一问题,电脑天空推荐微软常用运行库合集,一个集成了微软多个关键运行库组件的软件包。 📚 包含组件概览: Visual Basic Virtual Machine:…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
