题目描述
思路分析
原链表上进行修改,完成next和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) {
return head;
}
Node* newHead = head;
while (newHead) {//first copy
Node* cur = new Node(newHead->val);
cur->next = newHead->next;
newHead->next = cur;
newHead = cur->next;
}
newHead = head;
while (newHead) {//second copy
Node* curRad = newHead->random;
if (curRad) {
newHead->next->random = curRad->next;
}else {
newHead->next->random = NULL;
}
newHead = newHead->next->next;
}
newHead = head;
Node* ret = head->next;
Node* cur = newHead->next;
while (newHead) {//last update
newHead->next = cur->next;
newHead = newHead->next;
if (newHead == NULL) {
cur->next = NULL;
break;
}
cur->next = newHead->next;
cur = cur->next;
}
return ret;
}
};
结果分析
时间复杂度O(N)
空间复杂度O(N)