题目:
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个
random 指针指向链表中的任意节点或者 null。示例 1:
输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]] 示例 2:
输入:head = [[1,1],[2,1]] 输出:[[1,1],[2,1]]
分析:
1 . 复制各节点,构建拼接链表:
2 . 构建新链表各节点的 random 指向
3 . 拆分原 / 新链表:
4 . 返回新链表的头节点 res 即可。
解答:
/*
// 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;
while(cur != NULL){
Node* temp = new Node(cur->val);
temp->next = cur->next;
cur->next = temp;
cur = temp->next;
}
cur = head;
while(cur != NULL){
if(cur->random != NULL)
cur->next->random = cur->random->next;
cur = cur->next->next;
}
cur = head->next;
Node* pre = head;
Node* res = head->next;
while(cur->next != NULL){
pre->next = pre->next->next;
cur->next = cur->next->next;
pre = pre->next;
cur = cur->next;
}
pre->next = NULL;
return res;
}
};
执行用时:8 ms, 在所有 C++ 提交中击败了89.75%的用户
内存消耗:11 MB, 在所有 C++ 提交中击败了52.88%的用户