LeetCode 138 复制带随机指针的链表
- 题目描述
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
要求返回这个链表的 深拷贝。
我们用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index]
表示:
val:一个表示 Node.val 的整数。
random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为 null 。
- 题解
参考链接:https://leetcode-cn.com/problems/copy-list-with-random-pointer/solution/liang-chong-shi-xian-tu-jie-138-fu-zhi-dai-sui-ji-/
1. 时间O(N),空间O(N)
2. 时间O(N),空间O(1)
3. 时间O(N),空间O(N)
- 代码
class Solution {public:Node* copyRandomList(Node* head) {if (!head) return NULL;map<Node*,Node*> mymap;Node* p=head;while (p){Node* tmp=new Node(0);mymap[p]=tmp;p=p->next;}for (auto m:mymap){m.second->val=m.first->val;m.second->random=mymap[m.first->random];m.second->next=mymap[m.first->next];}return mymap[head];}
};
/*
// Definition for a Node.
class Node {
public:int val;Node* next;Node* random;Node(int _val) {val = _val;next = NULL;random = NULL;}
};
*/class Solution {public:Node* copyRandomList(Node* head) {if (!head) return NULL;Node* p=head;while (p){Node* tmp=new Node(p->val);tmp->next=p->next;p->next=tmp;p=tmp->next;}p=head;while (p){if (p->random) p->next->random=p->random->next;else p->next->random=NULL;p=p->next->next;}Node* node=new Node(-1),*q=node;p=head;while (p){q->next=p->next;q=q->next;p->next=q->next;p=p->next;}return node->next;}
};
- 说明
1. 我们可以使用哈希表,建立链表中每个节点与深拷贝之后相应节点之间的映射关系,之后为其赋值,val
的值相等,next的值即为原链表next节点在map中的对应节点,random的值也为原链表random节点在map中
的对应节点。
2. 我们可以不必使用哈希表来建立映射关系,在原链表中的每个节点后插入和其值相同的节点,这样相邻两个
节点就建立了对应关系,节点的random值为其原节点random的next节点,最后再把拷贝之后的链表抽出来即
可。
3. 将其视作图来进行深度优先搜索。
LeetCode 138 复制带随机指针的链表相关推荐
- LeetCode 138. 复制带随机指针的链表(哈希 / 深拷贝)
1. 题目 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的深拷贝. <剑指Offer>同题:面试题35. 复杂链表的复制 2 ...
- LeetCode 138 复制带随机指针的链表-中等
给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点. 构造这个链表的 深拷贝. 深拷贝应该正好由 n 个 全新 节点组成,其中每个新 ...
- Leetcode 138. 复制带随机指针的链表 解题思路及C++实现
解题思路: 主要包括三步. 第一步是遍历一次链表,复制其每一个节点,并将所复制的节点接在其后. 第二步是遍历一次链表,解决拷贝节点的random指针的指向. 第三步是从这个大链表中,拆出原有链表和拷贝 ...
- 138. 复制带随机指针的链表 golang
138. 复制带随机指针的链表 这个题结构体特殊,需要更改上一篇博客的node结构体 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的 深 ...
- leetcode 138. Copy List with Random Pointer | 138. 复制带随机指针的链表(复杂链表的复制)
题目 https://leetcode.com/problems/copy-list-with-random-pointer/ 题解 复杂链表的复制,经典问题,考察与 HashMap 的结合.注意如果 ...
- 138. 复制带随机指针的链表
链接:https://leetcode-cn.com/problems/copy-list-with-random-pointer/ https://www.jiuzhang.com/solution ...
- 【刷题日记】3.复制带随机指针的链表
目录 一.题目介绍 编辑 二.题目分析 三.代码实现 题目链接:138. 复制带随机指针的链表 - 力扣(LeetCode) 一.题目介绍 我们最一开始看到题目可能会没有思路,或者压根就不知道如何下 ...
- M1: 复制带随机指针的链表
一个链表问题:复制带随机指针的链表 题目:有一个链表L,其每个节点有2个指针,一个指针next指向链表的下个节点,另一个random随机指向链表中的任一个节点,可能是自己或者为空,写一个程序,要求复制 ...
- 【力扣】复制带随机指针的链表题解 C语言实现
前言 这是力扣里的一道经典链表题,据说掌握此题你对链表的理解能力就是优秀水平了 题目 /*** Definition for a Node.* struct Node {* int val;* str ...
最新文章
- LUA C 交互 cocos
- USB port 如何识别不同的Charger类型
- Android通用流行框架汇总
- mysql delete exists用法_自学MySQL第五天
- java中方法不调用会执行_java[新手]类里的方法没有调用为什么实现了?
- Windows: 在系统启动时运行程序、定时计划任务、定时关机
- 央行变相降准祭出又一新手段 引发同业套利之忧
- ul 原点显示_CSS+HTML ul li列表原点如何相连
- 如果成为一名高级安卓开发_想成为一名开发人员? 这是您需要考虑的。
- 三个火一个木组成的燊怎么读,燊是什么意思?
- 速修复!这个严重的 Apache Struts RCE 漏洞补丁不完整
- .NET在后置代码中输入JS提示语句(背景不会变白)
- PHP 数组常用操作函数随记
- foremost的下载安装使用说明
- 使用mybatis生成UUID
- 一氧化碳(CO)荧光探针cas855751-82-5,二氧化硫荧光探针 激发波长653 nm,发射波长836 nm-齐岳介绍
- 一种辅助整理WoS英文论文题录文档的方法(python-docx)
- 2018 阿里 声学模型 语言模型
- 俄罗斯方块(C/C++)
- cad2017单段线_AutoCAD2017命令总结
热门文章
- 算法——贝叶斯公式的推导过程
- 真正的出路只有一个(哈佛大学的幸福课)
- 第十二届 蓝桥杯 青少年C++组 10月比赛 第1题
- 第46课 精益求精 《小学生C++趣味编程》
- android 自动化 录制,android 自动化录制回放测试工具
- STM32H743+Keil-将变量定义到指定内存
- docker安装部署_有关docker安装yearning和部署inception(闭源)
- 【ES9(2018)】Object Rest Spread
- 【ES9(2018)】for await...of
- uni怎么使用原生html标签,uni-app如何完美解析富文本内容