剑指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.(注意,输出结果中请不要返回参数中的节点引用, ...
随机推荐
- C# StackExchange.Redis 用法总结
安装 StackExchange.Redis 在 NuGet 中搜索 StackExchange.Redis 和 Newtonsoft.Json,直接点击按钮安装即可. StackExchange.R ...
- Spring AOP 自动创建代理
Spring为我们提供了自动代理机制,让容器为我们自动生成代理,把我们从烦琐的配置工作中解放出来,在内部,Spring 使用BeanPostProcessor自动地完成这项工作. 1.实现 ...
- Mysql 索引迁移策略
Mysql 索引迁移策略 近日在核查项目中的一些慢sql时发现一个很鸡仔儿的问题,本地开发库表中索引跟生产上差距很大,又因为生产库登录各种麻烦,需要各种验证码,那么多的慢sql分给好些个人,不可能让大 ...
- Redis的学习笔记
一.Redis简介 1.关于关系型数据库和nosql数据库 关系型数据库是基于关系表的数据库,最终会将数据持久化到磁盘上,而nosql数据 库是基于特殊的结构,并将数据存储到内存的数据库.从性 ...
- 如何在vscode中调试python scrapy爬虫
本文环境为 Win10 64bit+VS Code+Python3.6,步骤简单罗列下,此方法可以不用单独建一个Py入口来调用命令行 安装Python,从官网下载,过程略,这里主要注意将python目 ...
- 做一个vue的todolist列表
<template> <div id="app"> <input type="text" v-model="todo&q ...
- CSS中的display属性(none,block,inline,inline-block,inherit)
css中的display属性(none,block,inline,inline-block,inherit) display属性是我们在前端开发中常常使用的一个属性,其中,最常见的有: none bl ...
- Mac同时安装python2和python3
Mac同时安装python2和python3 Mac自带python2,但因为开发时所用但pythonkennel是3也可能是2,并且就算是python2,版本号也许和内置但python也有所不同.所 ...
- sx1278 手册参考
记录下芯片的重要数据和内容,方便查阅,无代码实现 参考程序地址:http://www.pudn.com/Download/item/id/3070942.html http://www.cirmal ...
- 常用Git命令清单。
上期传送门:[清单]7个管理和优化网站资源的工具 下面是我整理的常用 Git 命令清单.几个专用名词的译名如下. Workspace:工作区 Index / Stage:暂存区 Repository: ...