题目

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。

思路一

我们可以用哈希表来存储<N,N'>,然后连接next和random

用空间复杂度O(n)将原本时间复杂度为O(n2)降低到O(n)

class Solution {
public:RandomListNode* Clone(RandomListNode* pHead){// 哈希表法if (!pHead)return nullptr;unordered_map<RandomListNode*, RandomListNode*> table;for (RandomListNode* p = pHead; p != nullptr; p = p->next)table[p] = new RandomListNode(p->label);for (RandomListNode* p = pHead; p != nullptr; p = p->next){table[p]->next = table[p->next];table[p]->random = table[p->random];}return table[pHead];}
};

思路二

三步走

1、将链表变为 A->A'->B->B'->C->C'

2、复制random连接

3、将这个链表按奇偶顺序拆成两个链表

/*
struct RandomListNode {int label;struct RandomListNode *next, *random;RandomListNode(int x) :label(x), next(NULL), random(NULL) {}
};
*/
class Solution {
public:RandomListNode* Clone(RandomListNode* pHead){if (!pHead)return nullptr;RandomListNode* curNode = pHead;// 复制链表形成 A - A' - B - B' - C - C'- NULLwhile (curNode) {RandomListNode* pClone = new RandomListNode(curNode->label);pClone->next = curNode->next;curNode->next = pClone;curNode = pClone->next;}curNode = pHead;//复制randomwhile (curNode) {RandomListNode* pClone = curNode->next;if (curNode->random)pClone->random = curNode->random->next;curNode = pClone->next;}// 拆分链表curNode = pHead;RandomListNode* pCloneHead = pHead->next, *temp = nullptr;while (curNode->next){temp = curNode->next;curNode->next = temp->next;curNode = temp;}return pCloneHead;}
};

转载于:https://www.cnblogs.com/shiganquan/p/9342605.html

【剑指offer】35、复杂链表的复制相关推荐

  1. 【LeetCode】剑指 Offer 35. 复杂链表的复制

    [LeetCode]剑指 Offer 35. 复杂链表的复制 文章目录 [LeetCode]剑指 Offer 35. 复杂链表的复制 package offer;import java.util.Ar ...

  2. 剑指 Offer 35. 复杂链表的复制

    剑指 Offer 35. 复杂链表的复制 题目 题目链接 解题思路 题目理解 解题思路 具体代码 题目 题目链接 https://leetcode-cn.com/problems/fu-za-lian ...

  3. 【三次优化】剑指 Offer 35. 复杂链表的复制

    立志用最少代码做最高效的表达 请实现 copyRandomList 函数,复制一个复杂链表.在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意 ...

  4. 剑指offer——35复杂链表的复制

    这题很是巧妙. 突破了常规思维. 竟然可以把传入进来的链表和复制的链表链在一起.然后再算出slibling指针.最后在分离. 直接把空间复杂度变为O(1)了. 很巧妙,很实用. 题目: 请实现函数Co ...

  5. 剑指 Offer 35. 复杂链表的复制(哈希/衍生拆分图解)

    题目描述 请实现 copyRandomList 函数,复制一个复杂链表.在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null. ...

  6. LeetCode笔记】剑指 Offer 35. 复杂链表的复制(Java、哈希表、原地算法)

    文章目录 题目描述 思路 && 代码 1. 哈希表法 2. 原地算法 二刷 题目描述 主要有两个考虑点: 不能改变原链表 新链表赋予 next.random 时,复制结点不一定存在 思 ...

  7. 【算法】剑指 Offer 35. 复杂链表的复制 【重刷】

    1.概述 地址:https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof/ 请实现 copyRandomList 函数,复制一个复 ...

  8. leetcode 剑指 Offer 35. 复杂链表的复制

    题意 将一个链表复制一遍后输出,这个链表除了next指针外,还有一个random指针,随机指向链表中的节点(包括自身或者NULL). 解法 生成一个新的链表,然后根据新老链表同时循环遍历,找到当前老链 ...

  9. 【LeetCode 剑指 Offer 35. 复杂链表的复制(中等)】

    题目: 请实现 copyRandomList 函数,复制一个复杂链表.在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null. ...

  10. 《剑指offer》-- 复杂链表的复制、字符串的排列、数组中出现次数超过一半的数字、连续子数组的最大和

    一.复杂链表的复制: 参考牛客网的chancy:https://www.nowcoder.com/questionTerminal/f836b2c43afc4b35ad6adc41ec941dba 1 ...

最新文章

  1. 在ubuntu14.04 64位中使用jd-gui
  2. Matplotlib入门
  3. [剑指Offer] 数据流中的中位数
  4. leetcode 122. 买卖股票的最佳时机 II(贪心算法)
  5. 阿里P8架构师谈:Docker简介、组成架构、使用步骤、以及生态产品
  6. linux安装c++版本eclipse以及编译增加指定库
  7. python变量作用域图解_python笔记--作用域、高阶函数、闭包
  8. matlab怎么画二维热力图_Tableau画日历热力图
  9. RHEL6与Oracle 11G R2之开篇:安装
  10. js 获得网页背景色和字体色
  11. 运行 Clojure 编程实战 5.3 节代码出现 Could not locate Clojure resource on classpath 问题
  12. 20191009 csp-s模拟T3(并查集)
  13. mysql批量添加空行_MySQL加入空行
  14. Natural Cleaning Solutions
  15. 韶关517功能水稻测产 国稻种芯-何登骥:中国水稻节广东活动
  16. Qt:图标刷新自动旋转
  17. Bugku杂项——图穷匕见
  18. Viso插入Word后空白过多解决方法
  19. 记一次我的Google电话面试经历
  20. Doris系列1-Doris介绍

热门文章

  1. mysql的zip包的安装方法
  2. 查看gradle dependencies
  3. 0.3 preface
  4. hdu4418 概率dp+高斯消元(近日吐槽)
  5. 项目class第十四周项目一:动物学叫
  6. Java 并发(入门梳理)
  7. opensource项目_生日快乐,Opensource.com:9年
  8. 您不知道Bash:Bash阵列简介
  9. 前端:JS/24/BOM和DOM简介,for...in循环遍历,window对象的属性和方法,延时器,定时器,screen屏幕对象,location地址栏对象,history历史记录对象
  10. jquery和javascript屏蔽右键菜单及阻止事件冒泡