解法一 哈希表
一次遍历在哈希表中建立新旧结点一 一对应关系,另一次遍历进行链接。
/*
// 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:
//hash表法,一次遍历建立新旧结点一一对应关系,另一次遍历进行链接
Node* copyRandomList(Node* head) {
if(!head) return NULL;
unordered_map<Node*,Node*> hash;
Node* p1 = head;
while(p1!=NULL){
Node* node = new Node(p1->val);
hash[p1] = node;
p1 = p1->next;
}
p1 = head;
while(p1!=NULL){
hash[p1]->next = hash[p1->next];
hash[p1]->random = hash[p1->random];
p1 = p1->next;
}
return hash[head];
}
};
时间复杂度 ,空间复杂度
。
解法二 拆分与拼接(空间优化)
空间优化,省去hash表,利用原链表的next结点原地构造,最后再复原。
借个图:(原图来源)
代码:
/*
// 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:
//空间优化,省去hash表,利用原链表的next结点原地构造,最后再复原
// Node* copyRandomList(Node* head) {
// }
};
时间复杂度 ,空间复杂度