剑指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.(注意,输出结果中请不要返回参数中的节点引用, ...
随机推荐
- M - 非诚勿扰 优先队列
来源 作为2013年699万应届毕业生中的一员,由于宏观经济的不景气,小明在毕业当天就华丽丽地失业了! 经历了千难万苦的求职过程,小明特别能理解毕业生的就业之难,所以,他现在准备创建一家专门针对IT人 ...
- ruby 基础知识2 - 区块 block
原文 1. block中的 yield 与遍历 5.times do |i| puts i end 或者 def my_times(n) i = 0 while n > i i += 1 yie ...
- js设计模式(六)---命令模式
命令模式算是最简单.优雅的模式之一了,命令模式中的命令指的是一个执行某些特定事情的指令.目的是吧请求发送者和请求接受者解耦, 就像点餐,顾客只需要发送菜单,谁去接收,不用考虑.厨师接收到命令开始做菜, ...
- 如何解决PuTTY中文乱码的问题
我们可以使用PuTTY这个工具在一台机器上对其它linux系统进行连接和操作.如果大家都在linux系统中,可以在终端中用ssh ip或主机名直接连接. 如果要在windows中对远程的linux系统 ...
- ubuntu 安装完后对于开发需要做的事情
是从 https://www.osboxes.org/ubuntu/ 下载的vdi文件,估计vmware对应的应该也有. 1. 安装 openssh-server apt-get install op ...
- 12.C# 接口和抽象类的区别
1.抽象类 声明方法的存在而不去实现它的类叫做抽象类,抽象类用abstract关键字声明.抽象类主要用来规定某些类的基本特征,继承它的子类必须实现抽象类的抽象成员,否则这个子类也为抽象类. publi ...
- 遇到NotificationService: Suppressing notification from package com.example.dell.servicebestpractice by u错误
一般来说是手机设置没有允许通知
- #WEB安全基础 : HTTP协议 | 0x6 初识HTTP报文
欢迎来到HTTP最精彩的部分 请注意:应用HTTP协议时,必定有一方担任客户端,另一方担任服务器 客户端向服务器发出请求,服务器向客户端返回响应 下面是一个请求与相应的例子: 请求: GET /ind ...
- 027-Session状态提供程序
Session分三种:1.InProc(进程内)-默认就是这种-速度快/但内存小/易丢失进程外:可以在IIS或ASPNET服务意外关闭时继续保持状态,注意此时存储到session中的对象必须支持序列化 ...
- [ Python ] OpenGL
pyOpenGL Installation Package Version------------------- -------numpy 1.14.2 PyOpenGL 3.1.0 PyOpenGL ...