news 2026/6/19 20:11:03

Leetcode 剑指 Offer II 154. 复杂链表的复制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Leetcode 剑指 Offer II 154. 复杂链表的复制

题目难度: 中等

原题链接

今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号算法精选里回复剑指offer2就能看到该系列当前连载的所有文章了, 记得关注哦~

题目描述

请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。

示例 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。

提示:

  • -10000 <= Node.val <= 10000
  • Node.random 为空(null)或指向链表中的节点。
  • 节点数目不超过 1000 。

题目思考

  1. 如何处理 random 指针?

解决方案

思路
  • 如果只有 next 指针的话很简单, 我们只需要对每个节点新建一个相同值的节点, 并保持指向关系, 逐个遍历过去即可
  • 现在多了个 random 指针, 想要定位新的指向的节点, 一个比较自然的想法就是额外维护一个老节点到新节点的映射关系, 可以用字典来实现
  • 第一遍遍历, 就只关注 next 部分, 并建立好映射关系
  • 第二遍遍历, 考虑 random 部分, 找到对应的新链表的节点, 然后当前节点的 random 指针指向它即可
复杂度
  • 时间复杂度O(N)
    • 每个节点只需要遍历两次
  • 空间复杂度O(N)
    • 额外需要一个字典
代码
classSolution:defcopyRandomList(self,head:'Node')->'Node':ifnothead:returnNonemaps={}# 第一遍遍历, 建立新的链表, 以及老节点到新节点的映射关系copyHead=Node(head.val)origin,copy=head,copyHead maps[origin]=copywhileorigin.next:# 新建下一个节点, 并建立next关系copy.next=Node(origin.next.val)origin=origin.nextcopy=copy.nextmaps[origin]=copy# 第二遍遍历, 处理random指针部分origin,copy=head,copyHeadwhileorigin:iforigin.random:# 如果老节点random指针指向非空的话, 就将当前新节点也指向随机节点对应的新节点copy.random=maps[origin.random]origin=origin.nextcopy=copy.nextreturncopyHead

大家可以在下面这些地方找到我~😊

我的 GitHub

我的 Leetcode

我的 CSDN

我的知乎专栏

我的头条号

我的牛客网博客

我的公众号: 算法精选, 欢迎大家扫码关注~😊

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/18 23:07:28

基于Java+ vueOA工程项目管理系统(源码+数据库+文档)

工程项目管理 目录 基于springboot vue工程项目管理系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue工程项目管理系统 一、前言 博主介绍&…

作者头像 李华
网站建设 2026/6/20 14:53:49

3步搭建OceanBase分布式数据库监控告警系统:告别被动运维

3步搭建OceanBase分布式数据库监控告警系统&#xff1a;告别被动运维 【免费下载链接】oceanbase OceanBase is an enterprise distributed relational database with high availability, high performance, horizontal scalability, and compatibility with SQL standards. …

作者头像 李华
网站建设 2026/6/20 14:57:46

机器学习容器化架构:私有仓库的深度集成策略

当企业级AI应用从实验走向生产&#xff0c;我们面临的不仅仅是技术选型问题&#xff0c;更是如何在复杂环境中构建可靠、安全、高效的部署体系。在这个背景下&#xff0c;容器化技术正成为MLOps的核心支柱&#xff0c;而私有仓库的集成则是确保这一体系稳定运行的关键环节。 【…

作者头像 李华
网站建设 2026/6/20 14:56:19

基于springboot + vue个人博客系统(源码+数据库+文档)

个人博客 目录 基于springboot vue个人博客系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue个人博客系统 一、前言 博主介绍&#xff1a;✌️大…

作者头像 李华
网站建设 2026/6/20 13:44:56

使用专业清理工具(如CCleaner)或系统自带的磁盘清理工具‌?

使用专业清理工具&#xff08;如CCleaner&#xff09;或系统自带的磁盘清理工具‌&#xff1f;当你的电脑变慢或者看到磁盘空间不足警告时,你面临一个简单的选择,使用专门的清理应用比如 ccleaner,或者使用操作系统自带的磁盘清理工具,两种选项都会清除临时文件、缓存和其他垃圾…

作者头像 李华
网站建设 2026/6/20 14:56:20

DeepWiki-Open开源项目:智能文档生成平台完整实践手册

DeepWiki-Open是一款基于人工智能技术的开源文档生成工具&#xff0c;专门为代码仓库提供自动化的Wiki文档创建服务。通过先进的AI算法&#xff0c;该平台能够深度分析GitHub、GitLab和BitBucket等主流代码托管平台的项目结构&#xff0c;生成专业级的交互式技术文档。 【免费下…

作者头像 李华