mirror of
https://github.com/ShusenTang/LeetCode.git
synced 2024-09-02 14:20:01 +00:00
Create 138. Copy List with Random Pointer.md
This commit is contained in:
parent
6f14419499
commit
04d2feb0eb
79
solutions/138. Copy List with Random Pointer.md
Normal file
79
solutions/138. Copy List with Random Pointer.md
Normal file
@ -0,0 +1,79 @@
|
||||
# [138. Copy List with Random Pointer](https://leetcode.com/problems/copy-list-with-random-pointer/)
|
||||
# 思路
|
||||
题目要求深拷贝一个链表,难点就在于如何处理随机指针的问题。
|
||||
(其实这题和[133. Clone Graph](https://leetcode.com/problems/clone-graph/)拷贝图是类似的,都需要用一个HashMap来记录节点与其副本的映射关系。)
|
||||
|
||||
## 思路一
|
||||
可以先不管random指针,遍历一遍链表并进行拷贝,同时用一个HashMap记录节点与其副本的隐射关系。第二次遍历再处理random指针。
|
||||
|
||||
## 思路二
|
||||
也可以采用DFS的思路进行递归拷贝,这样就和133. Clone Graph中的DFS解法很类似了。
|
||||
|
||||
## 思路三
|
||||
前两种方法都需要开辟一个HashMap,如果不允许额外开辟空间呢?
|
||||
|
||||
我们可以遍历一遍链表,然后将每个节点后接上其对应副本节点(同样是先不管副本节点的random指针),遍历完成后即变成
|
||||
```
|
||||
原链表(省略random,下同):
|
||||
1 -> 2 -> 3.
|
||||
将每个节点后接上其对应副本节点:
|
||||
1 -> 1' -> 2 -> 2' -> 3 -> 3'.
|
||||
```
|
||||
然后再遍历一遍处理好副本节点的random指针,最后将新的链表拆成新旧两个部分即可。
|
||||
代码这里就不写了,有兴趣可以去试试。
|
||||
|
||||
# C++
|
||||
## 思路一
|
||||
``` C++
|
||||
class Solution {
|
||||
public:
|
||||
Node* copyRandomList(Node* head) {
|
||||
if(!head) return NULL;
|
||||
unordered_map<Node*, Node*>mp;
|
||||
Node *head_cp = new Node(head -> val);
|
||||
mp[head] = head_cp;
|
||||
Node *p1 = head_cp, *p2 = head -> next;
|
||||
while(p2){
|
||||
p1 -> next = new Node(p2 -> val);
|
||||
mp[p2] = p1 -> next;
|
||||
|
||||
p1 = p1 -> next; p2 = p2 -> next;
|
||||
}
|
||||
p1 -> next = NULL;
|
||||
|
||||
p1 = head_cp; p2 = head;
|
||||
while(p2){
|
||||
p1 -> random = mp[p2 -> random];
|
||||
p1 = p1 -> next; p2 = p2 -> next;
|
||||
}
|
||||
|
||||
return head_cp;
|
||||
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
## 思路二
|
||||
``` C++
|
||||
class Solution {
|
||||
private:
|
||||
Node* DFS(Node *node, unordered_map<Node*, Node *>&mp){
|
||||
if(!node) return NULL;
|
||||
if(mp.count(node)) return mp[node];
|
||||
else{
|
||||
Node *node_cp = new Node(node -> val);
|
||||
mp[node] = node_cp;
|
||||
node_cp -> next = DFS(node -> next, mp);
|
||||
node_cp -> random = DFS(node -> random, mp);
|
||||
return node_cp;
|
||||
}
|
||||
}
|
||||
public:
|
||||
Node* copyRandomList(Node* head) {
|
||||
if(!head) return NULL;
|
||||
unordered_map<Node*, Node*>mp;
|
||||
return DFS(head, mp);
|
||||
|
||||
}
|
||||
};
|
||||
```
|
Loading…
Reference in New Issue
Block a user