实现思路
深拷贝的时候,连接下一节点这一操作的是简单的,难点在于,怎么确定新创建节点和原节点一一对应的关系进而去连接random
可以使用map操作,将原节点的地址映射到新创建节点的地址上。
另一种是将原节点映射到一个序号,利用vector现成序号的特性,在vector中再存储新节点的地址
实现代码
/*
// 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:
Node* copyRandomList(Node* head) {
map<Node*,Node*> map;
if(head==NULL) return NULL;
Node *thead=new Node(head->val);
Node *h1=head,*h2=head;
map[head]=thead;
while(head){
Node *t=new Node(head->val);
thead->next=t;
map[head]=t;
thead=t;
head=head->next;
}
while(h1){
Node *t1=map[h1];
t1->random=map[h1->random];
h1=h1->next;
}
return map[h2];
}
};
提交结果及分析
map, set, multimap, and multiset
上述四种容器采用红黑树实现,红黑树是平衡二叉树的一种。不同操作的时间复杂度近似为:
- 插入: O(logN)
- 查看:O(logN)
- 删除:O(logN)
有n个元素,所以事件复杂度是O(n(logn))
空降复杂度O(n)