138. Copy List with Random Pointer

1. Description

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.
The Linked List is represented in the input/output as a list of n nodes. Each node is represented as a pair of [val, random_index] where:

  • val: an integer representing Node.val
  • random_index: the index of the node (range from 0 to n-1) where random pointer points to, or null if it does not point to any node.

2. Example

Example 1:
Input: head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
Output: [[7,null],[13,0],[11,4],[10,2],[1,0]]
Leetcode 138

Example 2:
Input: head = [[1,1],[2,1]]
Output: [[1,1],[2,1]]
Leetcode 138

Example 3:
Input: head = [[3,null],[3,0],[3,null]]
Output: [[3,null],[3,0],[3,null]]
Leetcode 138

Example 4:
Input: head = []
Output: []
Explanation: Given linked list is empty (null pointer), so return null.

3. Constraints

  • -10000 <= Node.val <= 10000
  • Node.random is null or pointing to a node in the linked list.
  • The number of nodes will not exceed 1000.

4. Solutions

Three Iterations

n is the number of nodes in head
Time complexity: O(n)
Space complexity: O(1)

class Solution {
public:
    Node *copyRandomList(Node *head) {
        for (Node *iter = head; iter != nullptr; iter = iter->next->next) {
            Node *node = new Node(iter->val);
            node->next = iter->next;
            iter->next = node;
        }

        for (Node *iter = head; iter != nullptr; iter = iter->next->next) {
            iter->next->random = iter->random == nullptr ? nullptr : iter->random->next;
        }

        Node *guard = new Node(0);
        guard->next = head;
        for (Node *iter1 = guard, *iter2 = head; iter1 != nullptr && iter2 != nullptr;) {
            iter1->next = iter2->next;
            iter1 = iter1->next;

            iter2->next = iter1->next;
            iter2 = iter2->next;
        }

        return guard->next;
    }
};
comments powered by Disqus