题目描述

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的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'也相邻。
  • 把长链表拆开成两个链表。

代码

这里只给出第二种和第三种的参考代码。

解法二:

  1. // 第一种
  2. function RandomListNode(x) {
  3. this.label = x;
  4. this.next = null;
  5. this.random = null;
  6. }
  7. function Clone(pHead) {
  8. // write code here
  9. if (pHead === null) {
  10. return null;
  11. }
  12. const map = new Map();
  13. let p, p2;
  14. p = pHead;
  15. p2 = new RandomListNode(pHead.label);
  16. const pHead2 = p2;
  17. map.set(p, p2);
  18. while (p) {
  19. if (p.next) p2.next = new RandomListNode(p.next.label);
  20. else p2.next = null;
  21. p = p.next;
  22. p2 = p2.next;
  23. map.set(p, p2);
  24. }
  25. p = pHead;
  26. p2 = pHead2;
  27. while (p !== null) {
  28. p2.random = map.get(p.random);
  29. p = p.next;
  30. p2 = p2.next;
  31. }
  32. return pHead2;
  33. }

解法三:

  1. // 第二种
  2. /* function RandomListNode(x){
  3. this.label = x;
  4. this.next = null;
  5. this.random = null;
  6. }*/
  7. function Clone2(pHead) {
  8. cloneNodes(pHead);
  9. connectRandom(pHead);
  10. return reconnectNodes(pHead);
  11. }
  12. function cloneNodes(pHead) {
  13. // 复制链表
  14. let pNode = pHead;
  15. while (pNode !== null) {
  16. const newNode = new RandomListNode(pNode.label);
  17. newNode.next = pNode.next;
  18. pNode.next = newNode;
  19. pNode = newNode.next;
  20. }
  21. }
  22. function connectRandom(pHead) {
  23. // 设置random指针
  24. let pNode = pHead;
  25. while (pNode !== null) {
  26. if (pNode.random !== null) {
  27. pNode.next.random = pNode.random.next;
  28. }
  29. pNode = pNode.next.next;
  30. }
  31. }
  32. function reconnectNodes(pHead) {
  33. // 拆开链表
  34. let pNode = pHead;
  35. let newNodeHead = null,
  36. newNode = null;
  37. if (pNode !== null) {
  38. newNodeHead = newNode = pNode.next;
  39. pNode.next = newNode.next;
  40. pNode = newNode.next;
  41. }
  42. while (pNode !== null) {
  43. newNode.next = pNode.next;
  44. newNode = newNode.next;
  45. pNode.next = newNode.next;
  46. pNode = pNode.next;
  47. }
  48. return newNodeHead;
  49. }

剑指offer(25)复杂链表的复制的更多相关文章

  1. 剑指Offer 25. 复杂链表的复制 (链表)

    题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否 ...

  2. [剑指Offer] 25.复杂链表的复制

    /* struct RandomListNode { int label; struct RandomListNode *next, *random; RandomListNode(int x) : ...

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

    剑指 Offer 35. 复杂链表的复制 Offer_35 题目详情 方法一 可以使用一个HashMap来存储旧结点和新结点的映射. 这种方法需要遍历链表两遍,因为需要首先知道映射关系才能求出next ...

  4. 【剑指Offer】复杂链表的复制 解题报告(Python)

    [剑指Offer]复杂链表的复制 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题 ...

  5. 《剑指offer》复杂链表的复制

    本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:

  6. 【Java】 剑指offer(35) 复杂链表的复制

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请实现函数ComplexListNode* Clone(Compl ...

  7. Go语言实现:【剑指offer】复杂链表的复制

    该题目来源于牛客网<剑指offer>专题. 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.( ...

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

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

  9. 剑指OFFER之复杂链表的复制(九度OJ1524)

    题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点). 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一 ...

  10. 剑指offer:复杂链表的复制

    题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用, ...

随机推荐

  1. ZooKeeper-3.3.4集群安装配置

    https://blog.csdn.net/shirdrn/article/details/7183503

  2. javascript面试题(2)

    可以参考一  https://www.cnblogs.com/DCL1314/p/7903114.html 1.什么是JavaScript?(这是基本题,对很多程序员来说也是送分题!) JavaScr ...

  3. 给table加边框的样式

    <style> .tb { width: 1600px; text-align: center; border-collapse: collapse; } .tb tr td { bord ...

  4. 20、promise与ajax jsonp

    一.Promise的作用是什么? 当有多个请求之间有相互依赖关系(紧接着的请求需要上一次请求的返回结果),这时promise的作用就凸显出来了. 二.如何使用promise? new Promise( ...

  5. python学习之旅(六)

    Python基础知识(5):基本数据类型之字符串(Ⅱ) 字符串方法 17.join:对字符串进行拼接 x="can" y="li" y.join(x) 结果: ...

  6. c3p0 空指针异常 com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source.

    com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@11d9f05 -- Acquisition Attempt Failed!!! C ...

  7. 团队作业记账本开发NABCD

    N(Need)需求 现如今大学生的消费存在很大问题,很多情况下都是图一时之快,冲动消费,但是其实这些东西并不是特别需要.这样慢慢的堆积也就导致了大学生月月精光的局面.另外,现在基本上人手一部手机,许多 ...

  8. 初始Redis

    一.NoSql数据库(Not Only Sql): 1.又称为非关系型数据库,主流的NoSql数据库有: Redis,Hbase,MongoDB 2.NoSql产生的背景: 1.1.数据库的高并发的读 ...

  9. oracle 日期取 月 日

    今天碰到只要取月份和天数,如果月份前面有0要去掉0.比如说2010-01-08 ,需要的结果是1-8. 引出了一系列的sql语句 第一: 利用to_number的函数转换自动截0 select to_ ...

  10. mysql /tmp目录爆满问题的处理

    mysql /tmp目录爆满问题的处理 突然收到zabbix告警,说mysql服务器的/目录磁盘空间不足. 登录到服务器,看了下发现100GB的根目录,居然使用了差不多90GB.这台服务器上只跑了一个 ...