剑指 Offer 35. 复杂链表的复制
难度:中等。
奇奇怪怪的题,主要是完成链表的深拷贝。
由于不是寻常链表,有一个random指针,因此不能直接顺序去建立,这样random指向的node可能被重复拷贝。
两个方法都是看题解的,非常的妙。
使用map辅助
/*
// 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) {
if(head == nullptr)return head;
map<Node*, Node*> mList;
Node* cur = head;
while(cur != nullptr){
mList[cur] = new Node(cur->val);
cur = cur->next;
}
cur = head;
while(cur != nullptr){
mList[cur]->next = mList[cur->next];
mList[cur]->random = mList[cur->random];
cur = cur->next;
}
return mList[head];
}
};
结果:
先拼接再拆分
先在原链表每个节点后面创造一个与当前节点相同的节点,即使[1->5->3]变为[1->1->5->5->3->3],这一步不管random指针。
完成以上链表后,将random指针加到第二个节点上。
将链表进行拆分,得到最初的链表和最终要求的链表。
正确解法:
/*
// 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) {
if(head == nullptr)return head;
Node* cur = head;
while(cur != nullptr){
Node * temp = new Node(cur->val);
temp->next = cur->next;
cur->next = temp;
cur = temp->next;
}
cur = head;
while(cur != nullptr){
if(cur->random != nullptr)cur->next->random = cur->random->next;
cur = cur->next->next;
}
cur = head;
Node* result = cur->next, *res_cur = result;
while(cur != nullptr){
cur->next = res_cur->next;
if(res_cur->next != nullptr)res_cur->next = res_cur->next->next;
cur = cur->next;
res_cur = res_cur->next;
}
return result;
}
};
结果:
138. 复制带随机指针的链表
难度:中等。
标签:哈希表,链表。
2021.7.11 遇到了同样的题
想不起来之前怎么做的,看了下提示,有一条构建old node -> new node的映射,就想到了。
正确解法:
/*
// 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) {
if(head == NULL)return NULL;
Node* cur = head;
Node* newHead = NULL, *newCur = NULL;
unordered_map<Node*, Node*> maps;
while(cur != NULL){
if(newHead == NULL){
newHead = new Node(cur->val);
newCur = newHead;
}
else{
newCur->next = new Node(cur->val);
newCur = newCur->next;
}
maps[cur] = newCur;
cur = cur->next;
}
cur = head;
newCur = newHead;
while(cur != NULL){
if(cur->random != NULL)newCur->random = maps[cur->random];
cur = cur->next;
newCur = newCur->next;
}
return newHead;
}
};
结果: