Description
Solution
存在两种拷贝:深拷贝和浅拷贝
深拷贝主要是将另一个对象的属性值拷贝过来之后,另一个对象的属性值并不受到影响,
因为此时它自己在堆中开辟了自己的内存区域,不受外界干扰。
浅拷贝主要拷贝的是对象的引用值,当改变对象的值,另一个对象的值也会发生变化。
而本题需要我们用深拷贝来复制该复杂链表,若每个节点只有一个next指针指向下一个节点,则只需要顺序遍历一遍待拷贝链表,同时复制一份即可;但这里还有一个random指针,所有我们需要同时建立原链表和新链表内存地址的对应关系,再遍历一遍时进行random指针的赋值。
时间复杂度 O ( N log N ) O(N\log N) O(NlogN)
Code
/*
// Definition for a Node.
class Node {
public:
int val;
Node* next;
Node* random;
Node(int _val) {
val = _val;
next = NULL;
random = NULL;
}
};
*/
class Solution {
public:
typedef Node* pNode;
map<pNode, pNode>mp;
void dfs1(pNode Nnow, pNode now) {
pNode nx = new Node(0);
Nnow->val = now->val;
Nnow->next = nx;
mp[now] = Nnow;
if(now->next == NULL) {
Nnow->next = NULL;
return ;
}
dfs1(nx, now->next);
}
void dfs2(pNode Nnow, pNode now) {
if(now->random != NULL)
Nnow->random = mp[now->random];
else Nnow->random = NULL;
if(now->next == NULL) return ;
dfs2(Nnow->next, now->next);
}
Node* copyRandomList(Node* head) {
if(head == NULL) return NULL;
pNode Nhead = new Node(0);
dfs1(Nhead, head);
dfs2(Nhead, head);
return Nhead;
}
};