原链接:随机链表的复制
这道题并不难,容易想到使用哈希表(毕竟每一个节点都是独一无二的)
但是,怎么使用是一个问题
这里,我使用哈希表存储结点,key是它对应的原来的连表当中的结点,value就是它本身
为什么key是对应的原结点而不是对应的val?
通过Case3我们可以知道:

三个结点是可能相等的
这样我们哈希表进行存储就是有问题的
需要其他的用于区分不同的结点
原节点对应的random可以吗?
不行
多个节点的random可能是一样的
但是每个结点对应的原结点是独一无二的
通过(node,newNode)的键值对进行存储我们能够在后续代码当中快速找到对应的结点
整个思路:
-
一个while循环建立基础的链表,同时通过上述的哈希表进行存储
-
第二个while循环,遍历每个结点,通过哈希表查找对应的random结点
整体代码
java
class Solution {
public Node copyRandomList(Node head) {
Node preHead = new Node(0);
Node q=preHead;
Node p=head;
HashMap<Node, Node> pos = new HashMap<>();
//存在random是null的情况,需要存储
pos.put(null,null);
while(p!=null){
Node newNode = new Node(p.val);
pos.put(p,newNode);
q.next=newNode;
q=q.next;
p=p.next;
}
q=preHead.next;
p=head;
while(p!=null){
q.random=pos.get(p.random);
q=q.next;
p=p.next;
}
return preHead.next;
}
}
代码分析
时间复杂度:O(N)
空间复杂度:O(N)
和官方的两种方法时间复杂度相同,空间复杂度虽然不一定比得过,没有用到迭代或者回溯,更加简单易懂