news 2026/6/23 15:37:20

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/23 5:41:13

为什么这家医院的AI系统能像专家会诊一样精准诊断?

为什么这家医院的AI系统能像专家会诊一样精准诊断&#xff1f; 【免费下载链接】ERNIE-4.5-21B-A3B-PT 项目地址: https://ai.gitcode.com/hf_mirrors/baidu/ERNIE-4.5-21B-A3B-PT 想象一下这样的场景&#xff1a;深夜的急诊室里&#xff0c;一位医生面对着CT影像和复杂…

作者头像 李华
网站建设 2026/6/23 0:13:23

通配*|滚动hash

lc2489lc1983差值前缀和枚举右维护左class Solution { public:int widestPairOfIndices(vector<int>& nums1, vector<int>& nums2) {int nnums2.size();vector<int> d(n1);unordered_map<int,int> hash;hash[0]0;//initint ret0;for(int i1;i&…

作者头像 李华
网站建设 2026/6/20 20:07:01

FBCTF平台管理终极指南:从零搭建到高效运营的完整攻略

在当今网络安全竞赛蓬勃发展的时代&#xff0c;如何高效管理一个CTF平台成为众多技术管理员面临的挑战。本指南将带你深入了解FBCTF这一专业级CTF竞赛平台的管理技巧&#xff0c;助你轻松应对从平台部署到竞赛运营的全流程工作。 【免费下载链接】fbctf Platform to host Captu…

作者头像 李华
网站建设 2026/6/22 14:29:09

57、Python网络编程:客户端模块与URL访问

Python网络编程:客户端模块与URL访问 在网络编程中,程序可以作为客户端(访问资源的程序)或服务器(提供服务的程序)运行。客户端和服务器程序都需要处理协议问题(如如何访问和传输数据)以及数据格式问题。Python 库通过多个模块来处理这些问题,本文将重点介绍支持客户…

作者头像 李华
网站建设 2026/6/21 22:10:09

61、Python CGI编程与替代方案全解析

Python CGI编程与替代方案全解析 1. Python中的CGI编程基础 CGI(Common Gateway Interface)标准允许使用任何语言编写CGI脚本,而Python作为一种高级、高生产力的语言,非常适合用于CGI编程。Python标准库提供了处理典型CGI相关任务的模块。 2. 表单提交方法 CGI脚本常处…

作者头像 李华
网站建设 2026/6/23 17:34:44

Blender UI组件完整教程:从入门到精通打造专业3D界面

Blender UI组件完整教程&#xff1a;从入门到精通打造专业3D界面 【免费下载链接】awesome-blender &#x1fa90; A curated list of awesome Blender addons, tools, tutorials; and 3D resources for everyone. 项目地址: https://gitcode.com/GitHub_Trending/aw/awesome…

作者头像 李华