[算法分析与设计] leetcode 每周一题: Copy List with Random Pointer
2017-10-27 15:26
411 查看
题目链接:https://leetcode.com/problems/copy-list-with-random-pointer/description/
题目大意: 深度复制一个给定的链表,只是该链表节点有个成员会指向该链表的随机位置
思路:
这道题关键在于 如何 同构 随机节点和本节点关系,一开始我是打算直接开个vector存储链表本节点的index和随机节点的index,这样就可以简单粗暴获得两者的联系。然而在本题超时。然后我看了其他博客,发现可以用map来同构新链表和旧链表的关系。大概就是维护一个map,该map的key是旧链表的节点指针指针,value是新链表的节点,这样通过查询key的random就会返回一个新旧链表随机节点指针的复合体,就可以得到新节点的随机节点,代码如下:
/**
* Definition for singly-linked list with a random pointer.
* struct RandomListNode {
* int label;
* RandomListNode *next, *random;
* RandomListNode(int x) : label(x), next(NULL), random(NULL) {}
* };
*/
class Solution {
public:
RandomListNode *copyRandomList(RandomListNode *head) {
if(head == nullptr) return nullptr;
map<RandomListNode *, RandomListNode *> hash;
hash.insert(pair<RandomListNode *, RandomListNode *>(NULL, NULL));
RandomListNode * copyHead = new RandomListNode(head->label);
RandomListNode * subHead = head;
RandomListNode * tmp = copyHead;
while(subHead) {
hash.insert(pair<RandomListNode*, RandomListNode *>(subHead, tmp));
subHead = subHead->next;
if(subHead) {
tmp->next = new RandomListNode(subHead->label);
tmp = tmp->next;
}
}
tmp = copyHead;
subHead = head;
while(tmp) {
tmp->random = hash[subHead->random];
tmp = tmp->next;
subHead = subHead->next;
}
return copyHead;
}
};
题目大意: 深度复制一个给定的链表,只是该链表节点有个成员会指向该链表的随机位置
思路:
这道题关键在于 如何 同构 随机节点和本节点关系,一开始我是打算直接开个vector存储链表本节点的index和随机节点的index,这样就可以简单粗暴获得两者的联系。然而在本题超时。然后我看了其他博客,发现可以用map来同构新链表和旧链表的关系。大概就是维护一个map,该map的key是旧链表的节点指针指针,value是新链表的节点,这样通过查询key的random就会返回一个新旧链表随机节点指针的复合体,就可以得到新节点的随机节点,代码如下:
/**
* Definition for singly-linked list with a random pointer.
* struct RandomListNode {
* int label;
* RandomListNode *next, *random;
* RandomListNode(int x) : label(x), next(NULL), random(NULL) {}
* };
*/
class Solution {
public:
RandomListNode *copyRandomList(RandomListNode *head) {
if(head == nullptr) return nullptr;
map<RandomListNode *, RandomListNode *> hash;
hash.insert(pair<RandomListNode *, RandomListNode *>(NULL, NULL));
RandomListNode * copyHead = new RandomListNode(head->label);
RandomListNode * subHead = head;
RandomListNode * tmp = copyHead;
while(subHead) {
hash.insert(pair<RandomListNode*, RandomListNode *>(subHead, tmp));
subHead = subHead->next;
if(subHead) {
tmp->next = new RandomListNode(subHead->label);
tmp = tmp->next;
}
}
tmp = copyHead;
subHead = head;
while(tmp) {
tmp->random = hash[subHead->random];
tmp = tmp->next;
subHead = subHead->next;
}
return copyHead;
}
};
相关文章推荐
- LeetCode Copy List with Random Pointer 分析解答
- 【LeetCode-面试算法经典-Java实现】【138-Copy List with Random Pointer(拷贝有随机指针的单链表)】
- leetcode:Copy List with Random Pointer 细致分析,以及代码实现(JAVA版本)
- 【LeetCode-面试算法经典-Java实现】【143-Copy List with Random Pointer(有随机指针的链表复制)】
- Leetcode: Copy List With Random Pointer分析理解
- [Leetcode][JAVA] Clone Graph, Copy List with Random Pointer
- LeetCode——Copy List with Random Pointer
- leetcode -- Copy List with Random Pointer -- deep copy问题,dfs
- leetcode138~Copy List with Random Pointer
- LeetCode | Copy List with Random Pointer(赋值带有随机指针的链表)
- LeetCode OJ Copy List with Random Pointer
- Copy List With Random Pointer (LeetCode)
- Leetcode 138 Copy List with Random Pointer
- Leetcode: Copy List with Random Pointer
- leetCode解题报告之Copy List with Random Pointer
- LeetCode "Copy List with Random Pointer"
- leetcode:Copy List with Random Pointer
- leetcode-Copy List with Random Pointer
- [LeetCode]Copy List with Random Pointer
- LeetCode 138 Copy List with Random Pointer