算法题:剑指 Offer 35. 复杂链表的复制(题目+思路+代码+注释)时空 O(N) O(N) 0ms击败100%、47%用户
题外话,中等难度题一次AC秒杀100%用户属实有点小兴奋
题目
剑指 Offer 35. 复杂链表的复制
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
示例 1:
输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]
示例 2:
输入:head = [[1,1],[2,1]]
输出:[[1,1],[2,1]]
示例 3:
输入:head = [[3,null],[3,0],[3,null]]
输出:[[3,null],[3,0],[3,null]]
示例 4:
输入:head = []
输出:[]
解释:给定的链表为空(空指针),因此返回 null。
提示:
-10000 <= Node.val <= 10000
Node.random 为空(null)或指向链表中的节点。
节点数目不超过 1000 。
注意:本题与主站 138 题相同:https://leetcode-cn.com/problems/copy-list-with-random-pointer/
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
我看了下这不就是复制个链表,很简单,然后再仔细看了下有个random属性,随机指向了任意一个节点,麻烦的地方就在这,我要怎么去指向呢,一开始我想了下整两个数组,把链表变数组然后按照位置不就可以找到了,但是我想了下这如果用数组的话,我去查找那个random节点岂不是很慢,时间复杂度就成了O(N^2)了,不太行,我如果用哈希表呢,把原始链上的节点和复制出的节点作为kv这样岂不是查找的时候O(1)了,于是我建立了哈希表,遍历原始链,每个节点都创建个新的,然后把next赋值好,把random先赋值为原始链的,最后再统一利用哈希表kv操作把random也赋值好,非常巧妙了利用散列。很是舒服,一次AC秒杀100%用户。
代码
package leetcode.offer.q35;
import java.util.HashMap;
public class Solution {
public Node copyRandomList(Node head) {
Node root = null;
//用个哈希表来存
Node tmp = head,last = null;
HashMap<Node,Node> map = new HashMap<>();
while (tmp != null){
Node node = new Node(tmp.val);
//给root指向头节点
if (root == null){
root = node;
}
//给next赋值
if (last != null){
//上一个的next等于当前
last.next = node;
}else {
//还没有上一个则为当前
last = node;
}
//给random赋值,先设置为被复制链的,等下最后全部重新设置一遍就好
node.random = tmp.random;
//放入哈希表
map.put(tmp,node);
//收尾
last = node;
tmp = tmp.next;
}
//重新设置random
for (Node node : map.values()){
node.random = map.get(node.random);
}
return root;
}
}
class Node {
int val;
Node next;
Node random;
public Node(int val) {
this.val = val;
this.next = null;
this.random = null;
}
}
本文来自博客园,作者:HumorChen99,转载请注明原文链接:https://www.cnblogs.com/HumorChen/p/18039539