news 2026/6/10 17:19:50

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/10 16:25:39

AI生产工艺助手:制造业的智能技术专家

AI生产工艺助手&#xff1a;制造业的智能技术专家 【免费下载链接】llm-answer-engine Build a Perplexity-Inspired Answer Engine Using Next.js, Groq, Mixtral, Langchain, OpenAI, Brave & Serper 项目地址: https://gitcode.com/GitHub_Trending/ll/llm-answer-eng…

作者头像 李华
网站建设 2026/6/10 17:24:25

VSCode / Visual Studio 占用 C 盘怎么移?

VSCode / Visual Studio 占用 C 盘怎么移&#xff1f;visual studio 和 vs code 会占用 c: 驱动器大量空间, 这会让你的电脑变慢, 或者导致没有足够的空间用于 windows 更新和应用程序。如果你发现 c: 驱动器快满了, 并且你使用 visual studio 或 vs code, 你可以把它们的大多数…

作者头像 李华
网站建设 2026/6/9 16:16:23

UI-TARS:字节跳动开源多模态智能体,重新定义GUI自动化交互

UI-TARS&#xff1a;字节跳动开源多模态智能体&#xff0c;重新定义GUI自动化交互 【免费下载链接】UI-TARS-2B-SFT 项目地址: https://ai.gitcode.com/hf_mirrors/ByteDance-Seed/UI-TARS-2B-SFT 导语 字节跳动2025年开源的UI-TARS系列模型以单模型架构突破传统GUI自…

作者头像 李华
网站建设 2026/6/9 16:12:33

58、Python 客户端网络协议模块详解

Python 客户端网络协议模块详解 在网络编程中,Python 提供了丰富的标准库模块来支持各种网络协议,本文将详细介绍这些模块及其使用方法。 客户端网络协议模块基础 首先,介绍几个基础函数和方法: - has_data : r.has_data() 判断 r.get_data() 是否不为 None 。…

作者头像 李华
网站建设 2026/6/10 13:51:07

小白入网络安全:黄金赛道还是荆棘路?

网络安全转行指南&#xff1a;从误区到优势&#xff0c;收藏这篇少走弯路 文章针对零基础转行网络安全人群&#xff0c;指出三大误区&#xff08;误解薪资、急于求成、误判行业前景&#xff09;&#xff0c;阐述四大优势&#xff08;人才缺口大、门槛低、薪资高、学习有趣&…

作者头像 李华
网站建设 2026/6/10 13:52:26

Mem Reduct终极指南:实时内存监控与清理技术详解

Mem Reduct终极指南&#xff1a;实时内存监控与清理技术详解 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memreduct 你的电脑…

作者头像 李华