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
ith 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