劍指 Offer 35. 複雜連結串列的複製(Map)
阿新 • • 發佈:2021-02-11
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;
}
};