思路:由于每一个节点都有一个随机指针,这个指针可以为空,也可以指向链表的任意一个节点,如果我们在每生成一个新节点给其随机指针赋值时,都要去遍历原链表的话,OJ上肯定会超时,所以我们可以考虑用Hash map来缩短查找时间,第一遍遍历生成所有新节点时同时建立一个原节点和新节点的哈希表,第二遍给随机指针赋值时,查找时间是常数级。
/*
// Definition for a Node.
class Node {
public:
int val;
Node* next;
Node* random;
Node() {}
Node(int _val, Node* _next, Node* _random) {
val = _val;
next = _next;
random = _random;
}
};
*/
class Solution {
public:
Node* copyRandomList(Node* head) {
if(!head) return NULL;
Node* ans=new Node(head->val,NULL,NULL);
Node* node=ans;
Node* cur=head->next;
map<Node*,Node*> m;
m[head]=ans;
m[NULL]=NULL;
while(cur)
{
Node* tmp=new Node(cur->val,NULL,NULL);
node->next=tmp;
m[cur]=tmp;
node=node->next;
cur=cur->next;
}
node=ans;
cur=head;
while(node)
{
if(!cur->random) node->random=NULL;
else node->random = m[cur->random];
node=node->next;
cur=cur->next;
}
return ans;
}
};