# 138-Copy List with Random Pointer ###### tags: `Medium` ## Question https://leetcode.com/problems/copy-list-with-random-pointer/ ## Key - 如何複製list ## Reference https://ithelp.ithome.com.tw/articles/10268463 ## Solution ### Best sol. ```cpp= class Solution { public: Node* copyRandomList(Node* head) { if(nullptr==head){ return head; } Node* cur = head; // create a new node for each node, and make the new node insert into the original nodes while(nullptr!=cur){ Node* new_node = new Node(cur->val); new_node->next = cur->next; cur->next = new_node; cur = new_node->next; } // for the new nodes, make the random points to the new nodes cur = head; while(nullptr!=cur){ if(nullptr!=cur->random) { cur->next->random = cur->random->next; } cur = cur->next->next; } // separate the original list and the new list cur = head; Node* new_head=cur->next; Node* tmp= cur->next; while(nullptr!=cur){ cur->next = cur->next->next; // the last tmp->next will be nullptr if(nullptr!=tmp->next){ tmp->next = tmp->next->next; } cur = cur->next; tmp = tmp->next; } return new_head; } }; ``` ### Hash table sol. ```cpp= class Solution { public: Node* copyRandomList(Node* head) { map<Node*, Node*> m; Node* ptr = head; while (ptr) { m[ptr] =new Node(ptr->val); ptr = ptr->next; } ptr = head; while (ptr) { m[ptr]->next = m[ptr->next]; m[ptr]->random = m[ptr->random]; ptr = ptr->next; } return m[head]; } }; ```