热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【面试高频题】可逐步优化的链表高频题

题目描述这是LeetCode上的138.复制带随机指针的链表,难度为中等。Tag:「哈希表」、「链表」给你一个长度为n的链表,每个节点包含一个额外增加的

题目描述
这是 LeetCode 上的 138. 复制带随机指针的链表 ,难度为 中等。
Tag : 「哈希表」、「链表」
给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random,该指针可以指向链表中的任何节点或空节点。
构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。
例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ,同样有 x.random --> y 。
返回复制链表的头节点。
用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:

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

你的代码 只 接受原链表的头节点 head 作为传入参数。
示例 1:
在这里插入图片描述

输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

示例 2:
在这里插入图片描述

输入:head = [[1,1],[2,1]]输出:[[1,1],[2,1]]

示例 3:
在这里插入图片描述

输入:head = [[3,null],[3,0],[3,null]]输出:[[3,null],[3,0],[3,null]]

示例 4:

输入:head = []输出:[]解释:给定的链表为空(空指针),因此返回 null。

提示:

  • 0<&#61;n<&#61;10000
  • −10000<&#61;Node.val<&#61;10000

模拟 &#43; 哈希表

如果不考虑 random 指针的话&#xff0c;对一条链表进行拷贝&#xff0c;我们只需要使用两个指针&#xff1a;一个用于遍历原链表&#xff0c;一个用于构造新链表&#xff08;始终指向新链表的尾部&#xff09;即可。这一步操作可看做是「创建节点 &#43; 构建 next 指针关系」。
现在在此基础上增加一个 random 指针&#xff0c;我们可以将 next 指针和 random 指针关系的构建拆开进行&#xff1a;

1.先不考虑 random 指针&#xff0c;和原本的链表复制一样&#xff0c;创建新新节点&#xff0c;并构造 next 指针关系&#xff0c;同时使用「哈希表」记录原节点和新节点的映射关系&#xff1b;
2.对原链表和新链表进行同时遍历&#xff0c;对于原链表的每个节点上的 random 都通过「哈希表」找到对应的新 random 节点&#xff0c;并在新链表上构造 random 关系。

代码&#xff1a;

class Solution {public Node copyRandomList(Node head) {Node t &#61; head;Node dummy &#61; new Node(-10010), cur &#61; dummy;Map<Node, Node> map &#61; new HashMap<>();while (head !&#61; null) {Node node &#61; new Node(head.val);map.put(head, node);cur.next &#61; node;cur &#61; cur.next; head &#61; head.next;}cur &#61; dummy.next; head &#61; t;while (head !&#61; null) {cur.random &#61; map.get(head.random);cur &#61; cur.next; head &#61; head.next;}return dummy.next;}
}

时间复杂度&#xff1a;O(n)
空间复杂度&#xff1a;O(n)

模拟&#xff08;原地算法&#xff09;

显然时间复杂度上无法优化&#xff0c;考虑如何降低空间&#xff08;不使用「哈希表」&#xff09;。
我们使用「哈希表」的目的为了实现原节点和新节点的映射关系&#xff0c;更进一步的是为了快速找到某个节点 random 在新链表的位置。
那么我们可以利用原链表的 next 做一个临时中转&#xff0c;从而实现映射。
具体的&#xff0c;我们可以按照如下流程进行&#xff1a;

1.对原链表的每个节点节点进行复制&#xff0c;并追加到原节点的后面&#xff1b;
2.完成 1 操作之后&#xff0c;链表的奇数位置代表了原链表节点&#xff0c;链表的偶数位置代表了新链表节点&#xff0c;且每个原节点的 next 指针执行了对应的新节点。这时候&#xff0c;我们需要构造新链表的 random 指针关系&#xff0c;可以利用 link[i &#43; 1].random &#61; link[i].random.next&#xff0c;iii 为奇数下标&#xff0c;含义为 新链表节点的 random 指针指向旧链表对应节点的 random 指针的下一个值&#xff1b;
3.对链表进行拆分操作。

在这里插入图片描述

代码&#xff1a;

class Solution {public Node copyRandomList(Node head) {if (head &#61;&#61; null) return head;Node t &#61; head;while (head !&#61; null) {Node node &#61; new Node(head.val);node.next &#61; head.next;head.next &#61; node;head &#61; node.next;}head &#61; t;while (head !&#61; null) {if (head.random !&#61; null) head.next.random &#61; head.random.next;head &#61; head.next.next;}head &#61; t;Node ans &#61; head.next;while (head !&#61; null) {Node ne &#61; head.next;if (ne !&#61; null) head.next &#61; ne.next;head &#61; ne;}return ans;}
}

时间复杂度&#xff1a;O(n)
空间复杂度&#xff1a;O(1)

源码附件已经打包好上传到百度云了&#xff0c;大家自行下载即可&#xff5e;

链接: https://pan.baidu.com/s/14G-bpVthImHD4eosZUNSFA?pwd&#61;yu27
提取码: yu27
百度云链接不稳定&#xff0c;随时可能会失效&#xff0c;大家抓紧保存哈。

如果百度云链接失效了的话&#xff0c;请留言告诉我&#xff0c;我看到后会及时更新&#xff5e;

开源地址
码云地址&#xff1a;
http://github.crmeb.net/u/defu

Github 地址&#xff1a;
http://github.crmeb.net/u/defu

链接&#xff1a;https://juejin.cn/post/7129696149100363789


推荐阅读
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 20211101CleverTap参与度和分析工具功能平台学习/实践
    1.应用场景主要用于学习CleverTap的使用,该平台主要用于客户保留与参与平台.为客户提供价值.这里接触到的原因,是目前公司用到该平台的服务~2.学习操作 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
author-avatar
但须g婚后
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有