news 2026/5/13 6:14:17

032随机链表的复制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
032随机链表的复制

随机链表的复制

题目链接:https://leetcode.cn/problems/copy-list-with-random-pointer/description/?envType=study-plan-v2&envId=top-100-liked

我的解答:

public Node copyRandomList(Node head) { Node dummy = new Node(-1); Node cur=head, newCur, newPre=dummy; Map<Node, Integer> map = new HashMap<>(); Map<Integer, Node> newMap = new HashMap<>(); int count=0; while(cur!=null){ map.put(cur,count); newCur = new Node(cur.val); newMap.put(count,newCur); newPre.next = newCur; cur = cur.next; newPre = newCur; count++; } cur = head; newCur = dummy.next; while(cur != null){ if(cur.random != null){ newCur.random = newMap.get(map.get(cur.random)); } cur = cur.next; newCur = newCur.next; } return dummy.next; }

分析:代码的时间复杂度为O(n),空间复杂度为O(n)。解题思路:采用哈希表,map的key存储原始链表的节点,value存储序号,newMap的key存储序号,value存储拷贝链表的节点。先通过遍历原始链表建出新链表,将新、旧节点及其序号分别存入newMap和map,方便后续通过旧节点获取序号,然后新节点直接通过序号获取random。

看了官方题解后的解答:

//方法一:递归(回溯)+哈希表 //时间复杂度:O(n) //空间复杂度:O(n) //key:原始节点 value:拷贝节点 Map<Node,Node> map = new HashMap<>(); public Node copyRandomList(Node head) { if(head==null){ return null; } if(!map.containsKey(head)){ Node newHead = new Node(head.val); map.put(head,newHead); newHead.next = copyRandomList(head.next); newHead.random = copyRandomList(head.random); } return map.get(head); } //方法二:迭代+节点拆分 //时间复杂度:O(n) //空间复杂度:O(1) public Node copyRandomList(Node head) { if(head==null){ return null; } //第一遍遍历:拷贝原始节点,并将拷贝节点连接在原始节点之后 for(Node cur=head; cur!=null; cur=cur.next.next){ Node newCur = new Node(cur.val); newCur.next = cur.next; cur.next = newCur; } //第二遍遍历:拷贝原始节点的random for(Node cur=head; cur!=null; cur=cur.next.next){ Node newCur = cur.next; newCur.random = cur.random==null ? null : cur.random.next; } //第三遍遍历:拆分原始链表和拷贝链表 Node newHead = head.next; for(Node cur=head; cur!=null; cur=cur.next){ Node newCur = cur.next; cur.next = newCur.next; newCur.next = newCur.next==null ? null : newCur.next.next; } return newHead; }

分析:

​ 1、方法一采用递归。我们用map保存原始节点到拷贝节点的映射,若map中不存在当前原始节点的映射关系,我们就拷贝原始节点,并将原始节点和拷贝节点的映射关系放入map,然后继续递归拷贝原始节点的next和random;若map中存在当前原始节点的映射关系,我们直接通过原始节点获取对应的拷贝节点返回即可。

​ 2、方法二采用迭代+节点拆分。第一次遍历先将原始链表的每一个节点拷贝一份,并连接在其原始节点之后;第二次遍历根据原始节点的random连接拷贝节点对应的random,第三次遍历将原始链表和拷贝链表拆分,最后返回拷贝链表的头节点即可。

​ 3、方法一通过map保存原始节点与拷贝节点的映射关系,拷贝节点直接通过map获取random对应的拷贝节点;而方法二直接将每个原始节点的拷贝节点连接在拷贝节点之后(例如原始节点为S,拷贝节点为S’,假设原始链表为A—>B—>C,那么我们可以将原始链表拆分为A—>A’—>B—>B’—>C—>C’),拷贝节点可以直接通过原始节点的random找到拷贝节点的random。

总结

  • 本题主要需要思考如何获取每个拷贝节点的random,官方题解给出了两种方法,分别为Map映射关系和节点拆分。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/13 6:12:14

WordPress AI内容创作栈:基于Claude API的自动化写作与运维实践

1. 项目概述&#xff1a;一个为WordPress量身定制的AI内容创作栈最近在折腾一个内容站&#xff0c;发现内容创作和日常运维的重复性工作实在太多了。从构思文章大纲、撰写初稿&#xff0c;到批量处理图片、优化SEO元数据&#xff0c;再到回复评论、生成周报&#xff0c;这些工作…

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

终极指南:如何在Windows上使用智能PPT计时器掌控演示时间

终极指南&#xff1a;如何在Windows上使用智能PPT计时器掌控演示时间 【免费下载链接】ppttimer 一个简易的 PPT 计时器 项目地址: https://gitcode.com/gh_mirrors/pp/ppttimer 您是否曾在重要演讲中因为超时而尴尬收场&#xff1f;是否在商务汇报中因为时间把控不准而…

作者头像 李华
网站建设 2026/5/13 6:09:03

Node.js终端Canvas渲染引擎:虚拟终端与差异渲染原理详解

1. 项目概述&#xff1a;在终端里“画画”的底层利器 如果你是一名 Node.js 开发者&#xff0c;同时又对终端&#xff08;Terminal/Console&#xff09;里那些酷炫的动画、进度条或者交互式命令行工具着迷&#xff0c;那你很可能已经受够了用一堆零散的 console.log 和转义字…

作者头像 李华
网站建设 2026/5/13 6:05:42

微信聊天记录永久备份完整指南:WeChatExporter开源工具终极教程

微信聊天记录永久备份完整指南&#xff1a;WeChatExporter开源工具终极教程 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否担心珍贵的微信聊天记录会因为手机丢失…

作者头像 李华
网站建设 2026/5/13 6:01:21

从零搭建ROS Gazebo仿真小车:集成摄像头与YOLO目标检测实现视觉感知

1. 环境准备与ROS安装 在开始构建仿真小车之前&#xff0c;我们需要先搭建好开发环境。ROS&#xff08;Robot Operating System&#xff09;是目前机器人开发最流行的框架之一&#xff0c;它提供了硬件抽象、设备驱动、库函数、可视化工具等丰富功能。我推荐使用Ubuntu 20.04 L…

作者头像 李华
网站建设 2026/5/13 6:00:05

ARM指令集架构与编译器优化实践指南

1. ARM指令集架构概述 ARM处理器架构经过多年发展&#xff0c;形成了三种主要的指令集&#xff1a;A32&#xff08;原ARM指令集&#xff09;、T32&#xff08;原Thumb指令集&#xff09;和A64。这些指令集针对不同的处理器状态和架构版本设计&#xff0c;各有其特点和应用场景。…

作者头像 李华