1.题目要求

给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。

要求返回这个链表的深度拷贝。

2.解题思路

(1)笔试思路(求速度,拿分数):使用哈希表

  1. /**
  2. * Definition for singly-linked list with a random pointer.
  3. * struct RandomListNode {
  4. * int label;
  5. * RandomListNode *next, *random;
  6. * RandomListNode(int x) : label(x), next(NULL), random(NULL) {}
  7. * };
  8. */
  9. class Solution {
  10. public:
  11. RandomListNode *copyRandomList(RandomListNode *head) {
  12. /*(一对一的)哈希表map 空间O(n)*/
  13.  
  14. //判空
  15. if(head == NULL) return NULL;
  16.  
  17. //复制原链表,创建一个新链表,整个过程中两个链表是平行的,通过哈希表关联起来
  18. map<RandomListNode*,RandomListNode*> map;
  19. RandomListNode* cur = head;
  20.  
  21. //创建和原链表一样的结点,利用哈希表建立原链表结点和拷贝结点的一一对应关系
  22. while(cur!= NULL)
  23. {
  24. RandomListNode* copy_cur = new RandomListNode(cur->label) ;
  25. map[cur]=copy_cur;//下标功能强大,支持任意类型,不只是int
  26. cur = cur->next;
  27. }
  28.  
  29. //重新遍历一次链表,复制next和random关系
  30. cur = head;//回到表头
  31. while(cur != NULL)
  32. {
  33. map[cur]->next= map[cur->next];
  34. map[cur]->random = map[cur->random];
  35. cur = cur->next;
  36. }
  37. return map[head];//返回拷贝的新链表的表头
  38. }
  39. };

(2)面试思路(秀思维分析能力):不适用哈希表,将空间复杂度降低到O(1)。

  1. 例如:——>——>
  2. 利用下面的这个链接结构省略hash表,建立原链表结点与拷贝的新链表结点的一一对应关系。
  3. ——>'——>2——>2'——>——>'
  4.  
  5. 例如:-next->(原表上),由1-next->-next->',即可令1'-next->'
  6.  
  7. 例如:-random->(原表上),由1-random->-next->',即可令1'-random->'
  8.  
  9. 最后将两个链表分离出来即可,返回新链表的头结点。

Leetcode 138. 复制带随机指针的链表的更多相关文章

  1. Java实现 LeetCode 138 复制带随机指针的链表

    138. 复制带随机指针的链表 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的 深拷贝. 我们用一个由 n 个节点组成的链表来表示输入/ ...

  2. [LeetCode]138复制带随机指针的链表

    题目描述: 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的深度拷贝. 思路: 先遍历链表,将每个节点对应的随机指针指向的对象利用Hash ...

  3. LeetCode 138——复制带随机指针的链表

    1. 题目 2. 解答 第一次遍历链表的时候,复制旧链表的节点值建立一个新的链表,同时定义一个 unordered_map 作为哈希表,哈希表的键为旧链表的节点指针,值为新链表的节点指针. 然后,第二 ...

  4. 【leetcode 138. 复制带随机指针的链表】解题报告

    方法一:递归 unordered_map<Node*,Node*> dict; Node* copyRandomList(Node* head) { if (!head) return h ...

  5. LintCode-105.复制带随机指针的链表

    复制带随机指针的链表 给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点. 返回一个深拷贝的链表. 挑战 可否使用O(1)的空间 标签 哈希表 链表 优步 code / ...

  6. LeetCode 138:复制带随机指针的链表 Copy List with Random Pointer

    给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的深拷贝. A linked list is given such that each no ...

  7. 【LeetCode】138. Copy List with Random Pointer 复制带随机指针的链表 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人公众号:负雪明烛 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https:/ ...

  8. 138 Copy List with Random Pointer 复制带随机指针的链表

    给出一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点.返回一个深拷贝的链表. 详见:https://leetcode.com/problems/copy-list- ...

  9. [Java]LeetCode138. 复制带随机指针的链表 | Copy List with Random Pointer

    A linked list is given such that each node contains an additional random pointer which could point t ...

随机推荐

  1. 「雅礼集训 2017 Day1」市场 (线段树除法,区间最小,区间查询)

    老师说,你们暴力求除法也整不了多少次就归一了,暴力就好了(应该只有log(n)次) 于是暴力啊暴力,结果我归天了. 好吧,在各种题解的摧残下,我终于出了一篇巨好看(chou lou)代码(很多结构体党 ...

  2. nginx 应用篇

    nginx 信号控制(commanLine) kill singel  pid ps aux|grep nginx nginx 有两个进程,一个 master 一个worker 一个master管理一 ...

  3. isX字符串方法

    islower():返回True,如果字符串至少有一个字母,并且所有字母都是小写: 例如:>>> spam='Hello world' >>> spam.islow ...

  4. 【算法分析】如何理解快慢指针?判断linked list中是否有环、找到环的起始节点位置。以Leetcode 141. Linked List Cycle, 142. Linked List Cycle II 为例Python实现

    引入 快慢指针经常用于链表(linked list)中环(Cycle)相关的问题.LeetCode中对应题目分别是: 141. Linked List Cycle 判断linked list中是否有环 ...

  5. 文件操作---基于python

    # coding:utf-8from time import sleepimport sysreload(sys)sys.setdefaultencoding("utf8")f=o ...

  6. 在线求助man page

    一.举例——输入“man date” 图1 图2 图3 二.man之概述 用于:命令的使用说明 用法:man 命令 man page:执行“man 命令”后,出现的屏幕界面 补:man是manual( ...

  7. 2019寒假训练营寒假作业(三) MOOC的网络空间安全概论笔记部分

    目录 第五章 网络攻防技术 5.1:网络信息收集技术--网络踩点 信息收集的必要性及内容 网络信息收集技术 网络踩点(Footprinting) 网络踩点常用手段 5.2:网络信息收集技术 --网络扫 ...

  8. CentOS 6安装thrift支持erlang开发

    早前,在我的博文thrift多平台安装介绍了如何在debian/ubuntu下面安装thrift,并支持erlang开发的.而在CentOS平台下,并没有成功安装.经过不断摸索,终于成功了,这篇博文就 ...

  9. C# Excel2007 导出生成 2003兼容格式

    //导出2007格式 AppWb.Saved = true; //保存工作薄 AppExcel.ActiveWorkbook.SaveCopyAs(FilePath); //导出2003格式 AppW ...

  10. SQL 中 Date 与Datetime的区别

    Date是SQL Server 2008新引进的数据类型.它表示一个日子,不包含时间部分,可以表示的日期范围从公元元年1月1日到9999年12月31日.只需要3个字节的存储空间. DateTime 日 ...