Copy List with Random Pointer
Problem 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.
Solution It is straightforward to use a hash table to record the new node for each existing node. The new list can then be established from the table in linear time (
code). The drawback of a hash table is the space overhead. Here we offer another solution that takes $O(n)$ time and $O(1)$ auxiliary space (
code). The idea is as follows:
Step 1: Create a new node for each existing node and join them together, eg: A->B->C will become A->A'->B->B'->C->C', so that
n'
is a copy of
n
except that the random pointer in
n'
is not set.
Step 2: Copy the random links to the new nodes: for each node
n
,
n'.random = n.random.next
.
Step 3: Detach the new nodes from the list: for each node
n
,
n.next = n.next.next; n'.next = n'.next.next
.
Merge k Sorted Lists
Problem Merge $k$ sorted linked lists and return it as one sorted list.
Solution Denote the size of the $i$th list by $n_i$. Merging two lists with sizes $n_i$ and $n_j$ takes $\Theta(n_i+n_j)$ time. A naive approach to merge $k$ sorted lists would be merging them one by one. The time complexity would be $$\Theta(n_1+n_2) + \Theta(n_1+n_2+n_3) + ... + \Theta(n_1+...+n_k)=\Theta(kn_1+(k-1)n_2+...+n_k).$$
No comments:
Post a Comment