Day16: [LeetCode中等] 138. 复制带随机指针的链表
题源:
来自leetcode题库:
https://leetcode-cn.com/problems/copy-list-with-random-pointer/
思路:
这道题还挺有意思的,这道题之前的链表tag下的题还都挺常规的,但是这题让人眼前一亮!我的思路是这样的,遍历一遍原链表,先把正常的链表拷贝一下,也就是random都为NULL,然后遍历的同时,完成从原链表到拷贝链表的映射,也就是代码中的m2。
接着再遍历一次链表,完成原链表中每个节点对应起random节点的映射,也就是m2,。
最后遍历一次,完成拷贝链表的random指针对应的节点,这里需要两次映射,也就是代码中的m2[m1[p]]。
虽然我的方法要遍历三次,但是因为是加性的,所以时间复杂度依然O(n),不过运行时间不太好看,哈哈
值得一提的是原题的题解区真是各种值得学习的方法啊,果然越有创意的题方法就会多种多样。
代码:
dirty code凑合看吧
/*
// 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* res=new Node(head->val,NULL,NULL);
Node* p=head;
Node* rear=res;
unordered_map<Node*,Node*> m1;
unordered_map<Node*,Node*> m2;
m2[p]=rear;
p=p->next;
while(p){
rear->next=new Node(p->val,NULL,NULL);
rear=rear->next;
m2[p]=rear;
p=p->next;
}
p=head;
while(p){
m1[p]=p->random;
p=p->next;
}
Node* q=res;
p=head;
while(q){
q->random=m2[m1[p]];
q=q->next;
p=p->next;
}
return res;
}
};