138. Copy List with Random Pointer
//β Version 1 β HashMap Method (Simple & Clear)
//β± Time: O(n)
// πΎ Space: O(n)
function copyRandomList_O1(head: Node | null): Node | null {
if (head === null) return null;
let curr: Node | null = head;
// 1οΈβ£ Clone nodes and insert them between original nodes
while (curr) {
const copy = new Node(curr.val);
copy.next = curr.next;
curr.next = copy;
curr = copy.next;
}
// 2οΈβ£ Assign random pointers for the copies
curr = head;
while (curr) {
if (curr.random) {
curr.next!.random = curr.random.next;
}
curr = curr.next!.next;
}
// 3οΈβ£ Separate the original list and the copied list
curr = head;
const newHead = head.next;
while (curr) {
const copy = curr.next!;
curr.next = copy.next;
copy.next = copy.next ? copy.next.next : null;
curr = curr.next;
}
return newHead;
}
// β Version 2 β Interweaving Method (Optimal O(1) space)
// β± Time: O(n)
// πΎ Space: O(1)
function copyRandomList_O1(head: Node | null): Node | null {
if (head === null) return null;
let curr: Node | null = head;
// 1οΈβ£ Clone nodes and insert them between original nodes
while (curr) {
const copy = new Node(curr.val);
copy.next = curr.next;
curr.next = copy;
curr = copy.next;
}
// 2οΈβ£ Assign random pointers for the copies
curr = head;
while (curr) {
if (curr.random) {
curr.next!.random = curr.random.next;
}
curr = curr.next!.next;
}
// 3οΈβ£ Separate the original list and the copied list
curr = head;
const newHead = head.next;
while (curr) {
const copy = curr.next!;
curr.next = copy.next;
copy.next = copy.next ? copy.next.next : null;
curr = curr.next;
}
return newHead;
}
DSA – Linked List Quick Recap


