面试经典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.mfbz.cn/a/459128.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024/03/14(网络编程·day2)

一、思维导图 二、TCP通信 //服务器 #include<myhead.h>#define SER_PORT 8888 //服务器端口号 #define SER_IP "192.168.117.103" //服务器IP int main(int argc, const char *argv[]) {//1、创建一个套接字int sfd -1;sfd socket(AF_INET,SOCK_STREAM,…

Uni-app跟学笔记(五):uni-ui组件库的使用、项目打包(小程序、h5、APP)

文章目录 1&#xff09;uni-ui组件库的使用2&#xff09;项目打包1&#xff1a;微信小程序打包2&#xff1a;h5打包3&#xff1a;安卓打包 本博客为 uni-app 此门课的跟学笔记&#xff0c;目的是便于个人复习和对知识快速索引&#xff0c;源码素材可在均可在视频评论区找到 1&a…

Window部署AgileConfig

AgileConfig&#xff1a;分布式配置中心 github&#xff1a;GitHub - dotnetcore/AgileConfig: 基于.NET Core开发的轻量级分布式配置中心 / .NET Core lightweight configuration server 下载部署包&#xff1a;Releases dotnetcore/AgileConfig GitHub 版本&#xff1a;…

LeetCode刷题记录:(9)从中序与后序遍历序列构造二叉树

leetcode传送通道 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

HTML5:七天学会基础动画网页11

CSS3动画 CSS3过渡的基本用法: CSS3过渡是元素从一种样式逐渐改变为另一种样式的效果。 过渡属性-transition 值与说明 transition-property 必需&#xff0c;指定CSS属性的name&#xff0c;transition效果即哪个属性发生过渡。 transition-duration 必需&#xff0c;t…

基于数据库的全文检索实现

对于内容摘要&#xff0c;信件内容进行全文检索 基于SpringBoot 2.5.6Postgresqljpahibernate实现 依赖 <spring-boot.version>2.5.6</spring-boot.version> <hibernate-types-52.version>2.14.0</hibernate-types-52.version><dependency><…

挂耳式蓝牙耳机哪家的好用?一次搞定的全方位选购攻略

对于那些在锻炼时也不忘享受旋律的朋友们&#xff0c;我要透露挂耳式蓝牙耳机的魔力&#xff01;这种耳机实在是太棒了&#xff0c;我猜很多同好都跟我一样&#xff0c;在做运动时偏爱有音乐相伴&#xff0c;以点燃我们的运动激情。但使用传统入耳式蓝牙耳机跑步时&#xff0c;…

综合利用Cisco Packet Tracer模拟器配置园区网

1. 内容 1.在课室交换机中创建各个课室的VLAN&#xff0c;并将1-20端口平均分配给各个课室。 2.使用课室交换机的每个端口只能接入一台计算机&#xff0c;发现违规就丢弃未定义地址的包。3.网络内部使用DHCP分配各课室的IP地址&#xff0c;在课室交换机按照第一题划分的VLAN地…

ThinkBook 14 G3 ITLC(21A3)原厂Win11系统下载,恢复开箱预装oem系统

lenovo联想ThinkBook 14 G3 笔记本电脑原装出厂Windows11系统镜像安装包 链接&#xff1a;https://pan.baidu.com/s/1MZj2Fm7NYUsCwcT9pFGb8Q?pwdajf0 提取码&#xff1a;ajf0 联想笔记本原装系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、Office办公软件、联想…

【Linux】Centos7安装Nginx1.21.6

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件( IMAP/POP3)代理服务器。其特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上nginx的并发能力在同类型的网页服务器中表现较好&#xff0c;中国大陆使nginx的网站有:百度、京东、新浪、网易、腾讯、淘宝等。 …

蓝桥杯单片机快速开发笔记——HC573/HC138

一、原理分析 二、思维导图 三、代码参考 #include "HC573.h" #include "reg52.h"void Set_HC573(unsigned char channel, unsigned char dat) {P2 (P2 & 0x1f) | 0x00; //赋值之前&#xff0c;关闭全部锁存器P0 dat; //保存待设置…

钉钉小程序 - - - - - 如何通过一个链接打开小程序内的指定页面

方式1 钉钉小程序 scheme dingtalk://dingtalkclient/action/open_mini_app?miniAppId123&pagepages%2Findex%2Findex%3Fx%3D%25E4%25B8%25AD%25E6%2596%2587 方式2 https://applink.dingtalk.com/action/open_mini_app?type2&miniAppIdminiAppId&corpIdcorpId&…

【Git】error: bad signature 0xb86f1e1 和 bfatal: index file corrupt

一、问题 之前都好好的&#xff0c;今天执行 git add .的时候突然报错 报错原因翻译成中文&#xff1a;索引文件损坏 二、解决方法 方法1&#xff1a; 删除.git隐藏文件夹中的index文件 然后执行 git reset 重新生成index文件 git reset 方法2&#xff1a; 重新从远程克隆…

css之常用样式

展示样式一&#xff1a; <div class"showListBox"><div class"List" v-for"(i,index) in sealList" :key"index"> <div class"ListItemCon"><div class"ListItem-titleBox"><img src…

沉浸式感受旧时光,VR全景让游客都爱上老街区打卡地

近年来&#xff0c;随着城市建设的推进&#xff0c;很多老建筑以及周边的道路都发生了很大的变化&#xff0c;为了让更多的游客可以领略城市发展的进程以及旧时的人文风情&#xff0c;很多城市都会通过实地场景拍摄制作VR全景&#xff0c;将老街区、老建筑的真实场景进行虚拟再…

「SpringBrick快速入门指南」:☀️ 后端领域新兴技术璀璨之星☀️ 基于Spring Boot的高级插件化开发框架

文章目录 关于 | About技术文档 | Document开源项目 | Project 案例 | Demo项目结构 | Structure主程序配置集成 | Settings引入框架依赖 | Framework在配置文件加入配置 | YamlSpringBoot启动类改引导类 | Change 插件配置集成 | Settings引入依赖 | XML定义插件引导类 | Clas…

Python轴承故障诊断 (15)基于CNN-Transformer的一维故障信号识别模型

目录 往期精彩内容&#xff1a; 前言 1 轴承数据加载与预处理 1.1 导入数据 1.2 数据预处理&#xff0c;制作数据集 3 基于Pytorch的CNN-Transfromer轴承故障诊断分类 3.1 定义CNN-Transfromer分类网络模型 3.2 设置参数&#xff0c;训练模型 3.3 模型评估 代码、数据…

openstack(T)启动实例状态为错误,如何解决

---基本服务得是正常的 ---1.在web界面看是什么错误 点击你的实例名称&#xff0c;在概况里面去查看 当时我的error &#xff1a;编码500 消息 No valid host was found. 错误原因 1&#xff1a;资源不足 2&#xff1a;未开启虚拟机cpu虚拟化 解决&#xff1a; 1.资源不…

plotnine,一个非常实用的 Python 库!

大家好&#xff0c;今天为大家分享一个非常实用的 Python 库 - plotnine。 Github地址&#xff1a;https://github.com/has2k1/plotnine 在数据分析和可视化领域&#xff0c;Python 提供了许多强大的工具和库。其中&#xff0c;plotnine 是一个基于 Grammar of Graphics 理论的…

vmware workstation虚拟机报错”该虚拟机似乎正在使用中“

虚拟机报错&#xff1a; 解决方法&#xff1a; 进入到虚拟机的安装目录里&#xff0c;将lck结尾的文件删掉即可 重新点击虚拟机恢复正常
最新文章