面试经典150题——随机链表的复制

landscape photography of lake and mountain

前两天断更了两天有点事情🤗

1. 题目描述

image-20240310093647464

2.  题目分析与解析

2.1 思路一

开始还是没什么思路,没思路那就先把题目解决不管方法的好坏。如果不考虑复杂度,该怎么解决?

可以有这样的一种思路:

  1. 首先复制链表的所有节点,创造一个除了random全为空的相同链表

  2. 接下来按照每一个节点的random需要指向的位置,一个一个找到random指向的值,对random赋值

代码思路如下:

  1. 创建一个新的链表作为结果,一个指针指向结果链表的头部

  2. 遍历参数链表,复制一个一摸一样的链表

  3. 遍历参数链表,复制随机指针

  4. 返回结果链表

没想到还没有报超时:

image-20240314172831091

2.2 思路二——采用hash表

因为题目中只有一个random节点是格外需要注意的,那么我们就可以针对random节点怎么样想一种办法,根据思路一,让复制的链表在找random时能够最快的找到

因为如果要在找random时能够最快的找到,那么肯定是找引用,因为我们找的是一个Node对象。而结果链表和原始链表也肯定是对称的,也就是说原始链表的某一个节点的random指向某个节点,那么结果链表的对应节点的random也会指向对应的节点。所以难点就在于怎么样找到对应关系。

因此我们就可以想到定义一个<Node, Node>类型的结构,键作为原始链表的节点,值作为结果链表的节点。

先把所有的键都设置为原始链表的所有节点,那么键是不是也相当于构成了一个链表,对应的,我们再去对结果链表进行赋值。

  • 结果链表的某一个节点的next是不是就相当于原始链表的对应节点,也就是的next指向的的值?

  • 而random节点不也是对应的的random指向的的值?

所以我们可以有如下代码思路:

  1. 先创建一个哈希表,捆绑原始节点和新节点

  2. 遍历原始链表,更新新链表的next和random指针

  3. 返回新链表的头部

2.3 思路三——回溯 + 哈希表

引自作者:力扣官方题解

本题要求我们对一个特殊的链表进行深拷贝。如果是普通链表,我们可以直接按照遍历的顺序创建链表节点。而本题中因为随机指针的存在,当我们拷贝节点时,「当前节点的随机指针指向的节点」可能还没创建,因此我们需要变换思路。

一个可行方案是,我们利用回溯的方式,让每个节点的拷贝操作相互独立。对于当前节点,我们首先要进行拷贝,然后我们进行「当前节点的后继节点」和「当前节点的随机指针指向的节点」拷贝,拷贝完成后将创建的新节点的指针返回,即可完成当前节点的两指针的赋值。

具体地,我们用哈希表记录每一个节点对应新节点的创建情况。遍历该链表的过程中,我们检查「当前节点的后继节点」和「当前节点的随机指针指向的节点」的创建情况。如果这两个节点中的任何一个节点的新节点没有被创建,我们都立刻递归地进行创建。当我们拷贝完成,回溯到当前层时,我们即可完成当前节点的指针赋值。

注意一个节点可能被多个其他节点指向,因此我们可能递归地多次尝试拷贝某个节点,为了防止重复拷贝,我们需要首先检查当前节点是否被拷贝过,如果已经拷贝过,我们可以直接从哈希表中取出拷贝后的节点的指针并返回即可。

在实际代码中,我们需要特别判断给定节点为空节点的情况。

具体见后代码实现注释。其实这种思路和思路二是有点相似的,根据hashMap中的值来连接。

3.4 思路四——迭代 + 节点拆分

引自作者:力扣官方题解——我在代码中加了详细注释,看不懂题解可以直接看代码和动图

image-20240314210118271

recording

3. 代码实现

3.1 思路一

image-20240314173043930

image-20240314201440711

3.2 思路二

image-20240314201422107

image-20240314202232781

3.3 思路三

image-20240314205434543

image-20240314205344428

3.4 思路四

image-20240314211346947

image-20240314211357741

4. 相关复杂度分析

思路1

  • 时间复杂度: O(n²)。这种方法涉及到两次遍历原始链表。在复制随机指针时,对于每个节点都需要从头遍历链表以找到随机指向的节点,因此最坏情况下的时间复杂度为O(n²)。

  • 空间复杂度: O(1)。该方法仅使用了常数级别的额外空间(不考虑输出的空间),主要是几个临时变量。

思路2

  • 时间复杂度: O(n)。这种方法只需要遍历链表两次,一次用于复制节点并建立原节点和新节点之间的映射,另一次用于更新新链表中各节点的next和random指针。每次操作都可以在常数时间内完成,因此时间复杂度为O(n)。

  • 空间复杂度: O(n)。该方法需要一个HashMap来存储原节点与新节点之间的映射,最坏情况下需要存储n个键值对,因此空间复杂度为O(n)。

思路3

  • 时间复杂度: O(n)。通过递归的方式复制每个节点及其next和random指针。由于使用了哈希表来避免重复复制节点,确保每个节点只被复制一次,所以总的时间复杂度为O(n)。

  • 空间复杂度: O(n)。除了递归调用栈外,该方法同样需要一个HashMap来存储已经复制过的节点,以避免重复复制。最坏情况下,HashMap和递归栈的空间复杂度均为O(n)。

思路4

  • 时间复杂度: O(n)。该方法涉及三次遍历链表:一次用于在原节点后插入复制节点,一次用于更新所有新节点的random指针,最后一次用于拆分链表。每次遍历都可以在O(n)时间内完成。

  • 空间复杂度: O(1)。此方法在原始链表的基础上直接操作,不需要使用额外的空间来存储节点映射(忽略输出链表所占用的空间)。只使用了常数级别的额外空间,主要是几个用于遍历链表的临时变量。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记OnlyOffice的两个大坑

开发版&#xff0c;容器部署&#xff0c;试用许可已安装。 word&#xff0c;ppt&#xff0c;excel均能正常浏览。 自带的下载菜单按钮能用。 但config里自定义的downloadAs方法却不一而足。 word能正常下载&#xff0c;excel和ppt都不行。 仔细比对调试了代码。发现app.js…

fetch,前端 面试题

Fetch Fetch API 是近年来被提及将要取代XHR的技术新标准&#xff0c;是一个 HTML5 的 API。 基于promise的设计&#xff0c;返回的是Promise对象 fetch()采用模块化设计&#xff0c;API 分散在多个对象上&#xff08;Response 对象、Request 对象、Headers 对象&#xff09;…

Java双非大二找实习记录

先说结论&#xff1a;2.22→3.6线上线下面了七家&#xff0c;最后oc两家小公司&#xff0c;接了其中一个。 本人bg&#xff1a; 真名不经传双非一本&#xff0c;无绩点无竞赛无奖项无实习&#xff0c;23年12月开始学java。若非要说一点相关的经历&#xff0c;就是有java基础&…

新手向-从VNCTF2024的一道题学习QEMU Escape

[F] 说在前面 本文的草稿是边打边学边写出来的&#xff0c;文章思路会与一个“刚打完用户态 pwn 题就去打 QEMU Escape ”的人的思路相似&#xff0c;在分析结束以后我又在部分比较模糊的地方加入了一些补充&#xff0c;因此阅读起来可能会相对轻松&#xff08;当然也不排除这是…

Hadoop大数据应用:NFS网关 连接 HDFS集群

目录 一、实验 1.环境 2.NFS网关 连接 HDFS集群 3. NFS客户端挂载HDFS文件系统 二、问题 1.关闭服务报错 2.rsync 同步报错 3. mount挂载有哪些参数 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机架构软件版本IP备注hadoop NameNode &#xff08;…

Ubuntu 20.04 系统如何优雅地安装NCL?

一、什么是NCL&#xff1f; NCAR Command Language&#xff08;NCL&#xff09;是由美国大气研究中心&#xff08;NCAR&#xff09;推出的一款用于科学数据计算和可视化的免费软件。 它有着非常强大的文件输入和输出功能&#xff0c;可读写netCDF-3、netCDF-4 classic、HDF4、b…

【遍历方法】浅析Java中字符串、数组、集合的遍历

目录 前言 字符串篇 1.1 使用 for 循环和 charAt 方法 1.2 使用增强 for 循环&#xff08;forEach 循环&#xff09; 1.3 使用 Java 8 的 Stream API 最终效果 数组篇 2.1 使用普通 for 循环 2.2 使用增强型 for 循环( forEach 循环) 2.3 使用 Arrays.asList 和 forE…

C#调用Halcon出现尝试读取或写入受保护的内存,这通常指示其他内存已损坏。System.AccessViolationException

一、现象 在C#中调用Halcon&#xff0c;出现异常提示&#xff1a;尝试读取或写入受保护的内存,这通常指示其他内存已损坏。System.AccessViolationException 二、原因 多个线程同时访问Halcon中的某个公共变量&#xff0c;导致程序报错 三、测试 3.1 Halcon代码 其中tsp_width…

用户视角的比特币和以太坊外围技术整理

1. 引言 要点&#xff1a; 比特币L2基本强调交易内容的隐蔽性&#xff0c;P2P交易&#xff08;尤其是支付&#xff09;成为主流&#xff0c;给用户带来一定负担&#xff08;闪电网络&#xff09;在以太坊 L2 中&#xff0c;一定程度上减少了交易的隐蔽性&#xff0c;主流是实…

C语言 数据在内存中的存储

目录 前言 一、整数在内存中的存储 二、大小端字节序和字节序判断 2.1.练习一 2.2 练习二 2.3 练习三 2.4 练习四 2.5 练习五 2.6 练习六 三、浮点数在内存中的存储 3.1 浮点数存的过程 3.2 浮点数取的过程 总结 前言 数据在内存中根据数据类型有不同的存储方式&#xff0c;今…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的火焰与烟雾检测系统详解(深度学习模型+UI界面升级版+训练数据集)

摘要&#xff1a;本研究详细介绍了一种集成了最新YOLOv8算法的火焰与烟雾检测系统&#xff0c;并与YOLOv7、YOLOv6、YOLOv5等早期算法进行性能评估对比。该系统能够在包括图像、视频文件、实时视频流及批量文件中准确识别火焰与烟雾。文章深入探讨了YOLOv8算法的原理&#xff0…

Parade Series - Web Streamer Low Latency

Parade Series - FFMPEG (Stable X64) 延时测试秒表计时器 ini/config.ini [system] homeserver storestore\nvr.db versionV20240312001 verbosefalse [monitor] listrtsp00,rtsp01,rtsp02 timeout30000 [rtsp00] typelocal deviceSurface Camera Front schemartsp ip127…

软件杯 深度学习 python opencv 动物识别与检测

文章目录 0 前言1 深度学习实现动物识别与检测2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层 4 数据集准备4.1 数据标注简介4.2 数据保存…

前端框架vue的样式操作,以及vue提供的属性功能应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

基于Springboot+Vue+Sercurity实现的大学生健康管理平台

1.项目介绍 大学生健康档案管理系统&#xff0c;通过电子健康档案管理系统这个平台&#xff0c;可以实现人员健康情况的信息化、网络化、系统化、规范化管理&#xff0c;从繁杂的数据查询和统计中解脱出来&#xff0c;更好的掌握人员健康状况。系统的主要功能包括&#xff1a;…

2024年5家香港服务器推荐,性价比top5

​​香港服务器是中小企业建站、外贸建站、个人博客建站等领域非常受欢迎的服务器&#xff0c;2024年有哪些云厂商的香港服务器是比较有性价比的&#xff1f;这里根据小编在IT领域多年服务器使用经验&#xff0c;给大家罗列5家心目中最具性价比的香港服务器厂商。 这五家香港服…

StarRocks面试题及答案整理,最新面试题

StarRocks 的 MV&#xff08;物化视图&#xff09;机制是如何工作的&#xff1f; StarRocks 的物化视图&#xff08;MV&#xff09;机制通过预先计算和存储数据的聚合结果或者转换结果来提高查询性能。其工作原理如下&#xff1a; 1、数据预处理&#xff1a; 在创建物化视图时…

【静夜思】为什么我们会如此喜欢夜晚呢

作为一名大学生&#xff0c;熬夜对我来说已是常态。每天都是近乎一点钟才有困意&#xff0c;觉得应该上床睡觉了&#xff0c;即使明天早八&#xff0c;即使明天有很多课。我也观察过身边的朋友&#xff0c;他们中大多数也和我一样&#xff0c;基本都是在12点过后才入睡。当今的…

HTML静态网页成品作业(HTML+CSS)——家乡广州介绍设计制作(5个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有5个页面。 二、作品演示 三、代…

爱普生晶振发布RTC模块晶振(压电侠)

爱普生晶振一直以”省&#xff0c;小&#xff0c;精”技术作为资深核心&#xff0c;并且已经建立了一个原始的垂直整合制造模型&#xff0c;可以自己创建独特的核心技术和设备&#xff0c;使用这些作为基地的规划和设计提供独特价值的产品. 世界领先的石英晶体技术精工爱普生公…