LeetCode[中等] 138. 随机链表的复制

 

给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。

构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 

例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ,同样有 x.random --> y 。

返回复制链表的头节点。

用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:

  • val:一个表示 Node.val 的整数。
  • random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为  null 。

你的代码  接受原链表的头节点 head 作为传入参数。

思路

当链表不为空时,将链表的头结点记为 copyHead,其 next 指针和 random 指针指向的结点也需要复制,复制后的结果分别是结点 copyHead 的 next 指针和 random 指针指向的结点。对于 next 指针和 random 指针指向的结点,可以使用同样的方法复制。因此复制链表的过程是一个递归的过程。

为了避免重复操作,需要使用哈希表记录原始链表中的每个结点对应的复制链表中的结点,只有当原始链表中的结点未复制时才需要将该结点复制,如果原始链表中的结点已复制则从哈希表中获得对应的复制结点。

为何会重复操作:在递归过程中,如果链表中有多个节点相互引用,比如 nextrandom 指向已经复制的节点,未使用哈希表时,每次访问这些节点都会再次调用复制方法,导致重复的递归操作。这不仅增加了时间复杂度,还可能导致栈溢出。哈希表的作用是缓存已复制的节点,从而避免重复处理。

/*
// Definition for a Node.
public class Node {public int val;public Node next;public Node random;public Node(int _val) {val = _val;next = null;random = null;}
}
*/public class Solution {IDictionary<Node, Node> copyDictionary = new Dictionary<Node, Node>();public Node CopyRandomList(Node head) {if(head == null)return null;if(!copyDictionary.ContainsKey(head)){Node copyHead = new Node(head.val);copyDictionary.Add(head, copyHead);copyHead.next = CopyRandomList(head.next);copyHead.random = CopyRandomList(head.random);}return copyDictionary[head];}
}

复杂度分析

  • 时间复杂度:O(n),其中 n 是链表长度。复制链表的过程中,每个结点最多通过 next 指针和 random 指针各访问一次。

  • 空间复杂度:O(n),其中 n 是链表长度。哈希表和递归调用栈需要 O(n) 的空间。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

贴片式TF卡(SD NAND)参考设计

【MK 方德】贴片 TF 卡参考设计 一、电路设计 1、 参考电路&#xff1a; R1~R5 (10K-100 kΩ)是上拉电阻&#xff0c;当 SD NAND 处于高阻抗模式时&#xff0c;保护 CMD 和 DAT 线免受总线浮动。 即使主机使用 SD NAND SD 模式下的 1 位模式&#xff0c;主机也应通过上拉电阻…

SpringBoot 流式输出时,正常输出后为何突然报错?

一个 SpringBoot 项目同时使用了 Tomcat 的过滤器和 Spring 的拦截器&#xff0c;一些线程变量在过滤器中初始化并在拦截器中使用。 该项目需要调用大语言模型进行流式输出。 项目中&#xff0c;笔者使用 SpringBoot 的 ResponseEntity<StreamingResponseBody> 将流式输…

照片压缩方法分享,掌握这些小技巧轻松压缩

照片已成为我们记录生活、分享美好的重要方式。然而&#xff0c;随着手机像素的不断提升&#xff0c;照片文件体积也越来越大&#xff0c;给存储和传输带来了不小的挑战。今天&#xff0c;就为大家介绍几种高效的照片压缩方法&#xff0c;掌握这些方法就能够轻易对图片进行压缩…

寻找右区间

题目链接 寻找右区间 题目描述 注意点 -10^6 < starti < endi < 10^6每个间隔的起点都 不相同如果某个区间 i 不存在对应的 右侧区间 &#xff0c;则下标 i 处的值设为 -1 解答思路 因为本题需要找到每个interval大于interval对应end的最小start值&#xff0c;所…

vue-i18n在使用$t时提示类型错误

1. 问题描述 Vue3项目中&#xff0c;使用vue-i18n&#xff0c;在模版中使用$t时&#xff0c;页面可以正常渲染&#xff0c;但是类型报错。 相关依赖版本如下&#xff1a; "dependencies": {"vue": "^3.4.29","vue-i18n": "^9.1…

红绿灯倒计时读秒数字识别系统源码分享

红绿灯倒计时读秒数字识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of …

小程序开发平台源码系统 各行各业适用的小程序开的平台 带完整的安装代码包以及搭建部署教程

系统概述 本系统采用模块化设计&#xff0c;包含前端展示层、后端逻辑处理层、数据库存储层以及管理后台等多个核心组件。前端展示层负责小程序的界面设计与交互体验&#xff1b;后端逻辑处理层则负责数据处理、业务逻辑实现及与第三方服务的对接&#xff1b;数据库存储层用于…

符合二级等保要求的SSL证书

根据等级保护对象在国家安全、经济建设、社会生活中的重要程度&#xff0c;以及一旦遭到破坏、丧失功能或者数据被篡改、泄露、丢失、损毁后&#xff0c;对国家安全、社会秩序、公共利益以及公民&#xff0c;法人和其他组织的合法权益的侵害程度等因素&#xff0c;等级保护对象…

第1章 C++初识

1.1 编写第一个C程序 1.打开Visual Studio点击"创建新项目" 2.点击"空项目"&#xff0c;并点击"下一步" 3.设置"项目名称"并"设置地址" 4.打开项目后&#xff0c;右击"源文件"并选择"添加"的"新建…

低代码可视化开发-uniapp新闻跑马灯组件-代码生成器

新闻跑马灯效果组件是一种在新闻、数据可视化大屏或其他信息展示场景中常用的动态文本展示方式。它通过滚动文本的形式&#xff0c;在有限的空间内展示更多的信息内容&#xff0c;同时增加了视觉吸引力和动态感。以下是对新闻跑马灯效果组件的详细介绍&#xff1a; 一、定义与…

LVGL-触摸屏-实体按键-编码器-多功能按键)

在使用stm32移植lvgl时由于没有触摸屏&#xff0c;所以选择了编码器和按键作为输入设备。但是按照教程全部正确的设置了编码器和按键后&#xff0c;编码器的回调函数不能被调用即encoder_read();函数中的内容不能被调用。debug后发现是创建输入设备时的indev_drv被覆盖&#xf…

​ETHShanghai 2024:十月盛典,首批嘉宾重磅揭晓!

随着「ETHShanghai 2024」的筹备工作不断推进&#xff0c;已经邀请了多位重要嘉宾参与。同时&#xff0c;以太坊联合创始人Vitalik Buterin 也将通过线上形式参与并进行开幕致辞。 目前&#xff0c;已经确认出席的嘉宾还包括 Mask Network 创始人 Suji Yan、EthStorage 创始人…

eCharts扩展图表

地址&#xff1a;echarts图表集 示例截图&#xff1a;

【Redis】下载安装Redis和Redis图形化界面工具教程(2024最新版本,史上最详细)

目录 一、Redis简介 二、Redis下载和安装 2.1、下载 2.2、安装 2.3、环境变量配置&#xff08;可省略&#xff09; 三、Redis启动验证 3.1、点击键盘上的WinR键&#xff0c;在跳出的运行界面中输入cmd并确定 3.2、输入redis-cli -v 查看redis的版本号 3.3、接着我们再…

python爬虫案例——抓取三级跳转网页,实现逐页抓取,数据存入mysql数据库(10)

文章目录 1、目标任务2、网页分析3、完整代码1、目标任务 目标站点:情话网(http://www.ainicr.cn/tab/) 任务:抓取该网站下所有标签下的所有情话语句,并将其存入mysql数据库 2、网页分析 用浏览器打开网页,按F12或右键检查,进入开发者模式,在Network-Doc下找到网页的数…

Thingsboard规则链:Related Device Attributes节点详解

引言 在物联网&#xff08;IoT&#xff09;领域&#xff0c;Thingsboard作为一款强大的物联网平台&#xff0c;其规则链功能为企业提供了高度定制化的数据处理和自动化控制方案。其中&#xff0c;Related Device Attributes节点是一个特别实用的组件&#xff0c;它能够访问和操…

【专题】新能源发电行业及其市场化进程概览白皮书报告合集PDF分享(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p37802 随着中国经济结构的持续优化以及能源政策的不断进步&#xff0c;我国的能源消费呈现出稳定增长的态势。与此同时&#xff0c;能源利用效率逐步提高&#xff0c;清洁能源在能源结构中的比例也在稳步上升&#xff0c;这为国家的…

进阶数据库系列(十三):PostgreSQL 分区分表

概述 在组件开发迭代的过程中&#xff0c;随着使用时间的增加&#xff0c;数据库中的数据量也不断增加&#xff0c;因此数据库查询越来越慢。 通常加速数据库的方法很多&#xff0c;如添加特定的索引&#xff0c;将日志目录换到单独的磁盘分区&#xff0c;调整数据库引擎的参…

老照片修复工具有哪些?怎么让老照片焕发新光彩?

在那些泛黄的相框中&#xff0c;珍藏着我们最珍贵的记忆。 岁月流转&#xff0c;照片上的影像逐渐模糊&#xff0c;但那份情感却愈发深刻。 如何让这些老照片恢复往日的光彩&#xff0c;让那些珍贵的瞬间再次清晰呈现&#xff1f; 本文将带你探索老照片修复高清的技巧&#…

新书速览|Stable Diffusion-ComfyUI AI绘画工作流解析

《Stable Diffusion-ComfyUI AI绘画工作流解析》 本书内容 《Stable Diffusion-ComfyUI AI绘画工作流解析》从零开始&#xff0c;详尽系统地讲解从本地部署ComfyUI、下载安装自定义节点&#xff0c;到搭建各种工作流程的全过程。同时&#xff0c;辅以3D形象转绘、艺术二维码和证…