剑指offer-25、复杂链表的复制
题⽬描述
输⼊⼀个复杂链表(每个节点中有节点值,以及两个指针,⼀个指向下⼀个节点,另⼀个特殊指针random 指向⼀个随机节点),请对此链表进⾏深拷⻉,并返回拷⻉后的头结点。(注意,输出结果中请不要返回参数中的节点引⽤,否则判题程序会直接返回空)

思路及解答
哈希表映射
使用哈希表存储原节点和新节点的映射关系:
- 第一次遍历:创建所有新节点,并建立原节点到新节点的映射
- 第二次遍历:根据映射关系设置新节点的
next和random指针
public class Solution {
public Node copyRandomList(Node head) {
if (head == null) {
return null;
}
// 创建哈希表存储原节点到新节点的映射
HashMap<Node, Node> map = new HashMap<>();
Node current = head;
// 第一次遍历:创建所有新节点并建立映射
while (current != null) {
map.put(current, new Node(current.val));
current = current.next;
}
// 第二次遍历:设置新节点的next和random指针
current = head;
while (current != null) {
Node newNode = map.get(current);
newNode.next = map.get(current.next);
newNode.random = map.get(current.random);
current = current.next;
}
return map.get(head);
}
}
class Node {
int val;
Node next;
Node random;
public Node(int val) {
this.val = val;
this.next = null;
this.random = null;
}
}
- 时间复杂度:O(n),两次遍历链表
- 空间复杂度:O(n),需要存储所有节点的映射关系
节点插入拆分法
通过在原链表中插入新节点来避免使用额外空间:
- 节点复制插入:在每个原节点后面插入一个复制的新节点
- 设置random指针:新节点的random指向原节点random的下一个节点
- 链表拆分:将混合链表拆分为原链表和新链表
public class Solution {
public Node copyRandomList(Node head) {
if (head == null) {
return null;
}
// 第一步:在每个节点后面插入复制的节点
Node current = head;
while (current != null) {
Node newNode = new Node(current.val);
newNode.next = current.next;
current.next = newNode;
current = newNode.next;
}
// 第二步:设置复制节点的random指针
current = head;
while (current != null) {
if (current.random != null) {
current.next.random = current.random.next;
}
current = current.next.next;
}
// 第三步:拆分链表
Node newHead = head.next;
current = head;
while (current != null) {
Node temp = current.next;
current.next = temp.next;
if (temp.next != null) {
temp.next = temp.next.next;
}
current = current.next;
}
return newHead;
}
}
- 时间复杂度:O(n),三次遍历链表
- 空间复杂度:O(1),只使用固定数量的指针变量
剑指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.(注意,输出结果中请不要返回参数中的节点引用, ...
随机推荐
- 腾讯云的devops自动化部署代替jenkins
起因 jenkins太耗内存了,经常导致服务器崩. 了解到devOps也是做类似的服务的,遂用之. serverless framework也可以做这个,但是截至目前,只能够打包node项目. dev ...
- Luogu P11131 【MX-X5-T3】「GFOI Round 1」Cthugha 题解
P11131 [MX-X5-T3]「GFOI Round 1」Cthugha 有意思的最短路题目,需要对迪杰斯特拉算法有深入的理解. 首先,不存在最小值的条件是相邻的两个格子加起来值小于 \(0\), ...
- spring中常见的注解 autowired
简介 spring中常见的注解 autowired 简单概括就是 自动注入 autowired 默认按照类型去容器中查找 如果找到多个相同类型的组件,再将属性名作为组件的id去容器中查找 猜测: 将抽 ...
- MFC 程序 输出打印字符
简介 因为自己的科研方向接触到一个远古时期的代码,现在如果要学习这个代码少不了要对其重新编译,打印输出. 参考链接 如何以控制台的方式运行程序 https://blog.csdn.net/weixin ...
- 触摸/液位/感应三合一SC01F芯片的高性能解决方案
触摸/液位/感应三合一SC01F芯片的高性能解决方案 SC01F是厦门晶尊微电子的单键电容触摸感应芯片,它可以通过任何非导电介质(如玻璃和塑料)来感应电容变化. SC01F应用场景 SC01F可以实现 ...
- 线上问题定位神器:Arthas
前言 我经历过凌晨3点被报警叫醒的慌乱,也体会过定位难题的煎熬. 90%的线上问题都源于"三个不知道":不知道哪慢.不知道谁卡.不知道为何错. 这篇文章跟大家一起聊聊如何用Arth ...
- SciTech-Logic:逻辑学-Introduction to Logic: Irvine - 5.4 质、量 与 周延性
SciTech-Logic:逻辑学-Introduction to Logic: Irvine - 5.2 Class and Statement 类与直言命题 A.质 我们已经看到,每个标准直言命题 ...
- spring中aop不生效的几种解决办法
先看下这个问题的背景:假设有一个spring应用,开发人员希望自定义一个注解@Log,可以加到指定的方法上,实现自动记录日志(入参.出参.响应耗时这些) package com.cnblogs.yjm ...
- Win11系统更新失败错误0x800f081f的问题
使用Windows11系统的电脑基地用户都知道,win11更新补丁漏洞是十分勤奋的,可以说每周都会更新一次,而不少用户在更新的时候却遇到一些问题,出现错误代码0x800f081f,导致更新失败.那么遇 ...
- unity自由自定义添加Editor快捷键
在Editor下监听按键有以下几种方式: 1.自定义菜单栏功能: 比如F5键暂停编辑器 using System.Collections; using System.Collections.Gener ...