面试题35:复杂链表的复制
题目:请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
方法一:暴力
先构建链表,然后再一个一个的找 random 指针所指向的结点
- 时间复杂度O(n^2)
- 空间复杂度O(1)
时间效率太差了,完全没有美感
方法二:空间换时间
用一个大小为 n 的 hash 表存储,用 O(n) 的空间把时间从 O(n^2) 降到 O(n)
方法三:同步复制
第一趟遍历构建复制结点,对链表中的每一个结点作一个复制,复制结点链接在当前结点之后,复制的结点的 next 为当前结点的下一个结点。
第二趟遍历,构建 random 指针,复制结点的 random 指针指向,当前结点 random 的下一个结点,同时断开当前结点和复制结点的链接,就可以得到深拷贝的复杂链表了。
- 指针太乱了,可以多定义几个防止混淆和空指针判定
- 时间复杂度O(n)
- 空间复杂度O(1)
class Solution {public Node copyRandomList(Node head) {if (head == null ){return null;}Node curr = head;//拷贝链表,并且把链表连接起来while(curr != null){Node next = curr.next;Node copy = new Node(curr.val);curr.next = copy;copy.next = next;curr = next;}//指定随即指针curr = head;while(curr != null){Node next = curr.next.next;//原节点的下一个节点Node currCopy = curr.next;//当前的拷贝节点currCopy.random = curr.random!=null?curr.random.next:null;//指定随机指针节点curr = next;//当前节点指向下一个节点}//拆分链表curr = head;Node res = curr.next;//用于返回的拷贝头节点while (curr != null){Node next = curr.next.next;//原节点的下一个节点Node curCopy = curr.next;//拷贝节点curr.next = next;//将原节点指向下一个原节点curCopy.next = next!=null?next.next:null;//拷贝节点的下一个节点指向下一个原节点的下一个节点curr = next;//将当前节点指向下一个原节点}return res;}
}
面试题35:复杂链表的复制相关推荐
- 剑指offer:面试题35. 复杂链表的复制
题目:复杂链表的复制 请实现 copyRandomList 函数,复制一个复杂链表.在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 ...
- 剑指offer面试题35. 复杂链表的复制(DFS)(深拷贝)
题目描述 请实现 copyRandomList 函数,复制一个复杂链表.在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null. ...
- 面试题35. 复杂链表的复制
请实现 copyRandomList 函数,复制一个复杂链表.在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null. 示例 1 ...
- 【LeetCode】剑指 Offer 35. 复杂链表的复制
[LeetCode]剑指 Offer 35. 复杂链表的复制 文章目录 [LeetCode]剑指 Offer 35. 复杂链表的复制 package offer;import java.util.Ar ...
- 剑指 Offer 35. 复杂链表的复制
剑指 Offer 35. 复杂链表的复制 题目 题目链接 解题思路 题目理解 解题思路 具体代码 题目 题目链接 https://leetcode-cn.com/problems/fu-za-lian ...
- 【三次优化】剑指 Offer 35. 复杂链表的复制
立志用最少代码做最高效的表达 请实现 copyRandomList 函数,复制一个复杂链表.在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意 ...
- 剑指offer——35复杂链表的复制
这题很是巧妙. 突破了常规思维. 竟然可以把传入进来的链表和复制的链表链在一起.然后再算出slibling指针.最后在分离. 直接把空间复杂度变为O(1)了. 很巧妙,很实用. 题目: 请实现函数Co ...
- 剑指 Offer 35. 复杂链表的复制(哈希/衍生拆分图解)
题目描述 请实现 copyRandomList 函数,复制一个复杂链表.在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null. ...
- LeetCode笔记】剑指 Offer 35. 复杂链表的复制(Java、哈希表、原地算法)
文章目录 题目描述 思路 && 代码 1. 哈希表法 2. 原地算法 二刷 题目描述 主要有两个考虑点: 不能改变原链表 新链表赋予 next.random 时,复制结点不一定存在 思 ...
- 35. 复杂链表的复制
链接 https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof/ 难度: #中等 题目 请实现 copyRandomList 函数 ...
最新文章
- 爬虫网页搜索策略的选择
- 百度的智能办公平台来了!12岁百度Hi今天全面升级,让协作「如流」
- JS中自定义replace可替换特殊符号$等,但无法忽略大小写的函数
- zoj 1438 - Asteroids!
- MySQL删除用户(DROP USER)
- 第十二节 VMware View 6.0 菜鸟入门 部署和安装2008 R2 RDS服务
- Hive分析窗口函数(五) GROUPING SETS,GROUPING__ID,CUBE,ROLLUP
- java system.load()_System.load()与System.loadLibrary()
- 一个简单的完成端口(服务端/客户端)类
- 【分布式】分布式架构-ESB SOA
- java定义一个二维数组
- MAC Nginx配置: open() “xxx/logs/error.log“ failed (2: No such file or direc
- MySQL 数据库之实现热备份
- Android 红外遥控器实现
- APP运营推广,如何做到“饱和攻击”
- 三种实现分布式锁的方式
- 利用python获取自己的qq群成员信息!
- 携手企业创新 共创美好未来——低代码助力企业数字化
- 工业机器人(5)-串口通信技术与MODBUS协议
- 最简要的DPlayer样例