Copy List with Random Pointer
A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.
Return a deep copy of the list.
深度复制带有随机指针Node的链表方法一:map映射
RandomListNode *copyRandomList(RandomListNode *head)
{
if(head == NULL)
return NULL;
map<RandomListNode*,RandomListNode*> transform;
RandomListNode* newHead = new RandomListNode(head->label);
transform.insert(make_pair(head,newHead));
RandomListNode* p1 = head->next;
RandomListNode* p2 = newHead;
while(p1 != NULL)
{
p2->next = new RandomListNode(p1->label);
transform.insert(make_pair(p1,p2->next));
p1 = p1->next;
p2 = p2->next;
}
p1 = head;
p2 = newHead;
while(p1!=NULL)
{
if(p1->random == NULL)
p2->random = NULL;
else
p2->random = transform.find(p1->random)->second;
p1 = p1->next;
p2 = p2->next;
}
return newHead;
}
RandomListNode *copyRandomList(RandomListNode *head)
{
if(head == NULL)
return NULL;
map<RandomListNode*,RandomListNode*> transform;
RandomListNode* newHead = new RandomListNode(head->label);
transform.insert(make_pair(head,newHead));
RandomListNode* p1 = head->next;
RandomListNode* p2 = newHead;
while(p1 != NULL)
{
p2->next = new RandomListNode(p1->label);
transform.insert(make_pair(p1,p2->next));
p1 = p1->next;
p2 = p2->next;
}
p1 = head;
p2 = newHead;
while(p1!=NULL)
{
if(p1->random == NULL)
p2->random = NULL;
else
p2->random = transform.find(p1->random)->second;
p1 = p1->next;
p2 = p2->next;
}
return newHead;
}
已AC 348ms 时间复杂度与空间复杂度都为O(n)
方法二:巧妙的将新节点加入旧节点的next
RandomListNode *copyRandomList(RandomListNode *head)
{
if(head == NULL)
return NULL;
RandomListNode* tmp = head;
while(tmp!=NULL)
{
RandomListNode* node = new RandomListNode(tmp->label);
node->next = tmp->next;
tmp->next = node;
tmp = tmp->next->next;
}
tmp = head;
while(tmp!=NULL)
{
if(tmp->random == NULL)
tmp->next->random = NULL;
else
tmp->next->random = tmp->random->next;
tmp = tmp->next->next;
}
tmp = head;
RandomListNode* newHead = head->next;
RandomListNode* newNode = head->next;
while(tmp!=NULL)
{
tmp->next = newNode->next;
tmp=tmp->next;
if(tmp == NULL)
break;
newNode->next = tmp->next;
newNode = newNode->next;
}
return newHead;
}
已AC 280ms 时间复杂度为O(n) 空间复杂度为O(1)