TIP102 Unit 6 Session 2 Advanced (Click for link to problem statements)
Understand what the interviewer is asking for by using test cases and questions about the problem.
playlist1
from index a
to index b
and replace it with playlist2
.playlist1
.HAPPY CASE
Input:
- playlist1 = Node(('Flea', 'St. Vincent'), Node(('Juice', 'Lizzo'), Node(('Tenderness', 'Jay Som'), Node(('Ego Death', 'The Internet'), Node(('Empty', 'Kevin Abstract'))))))
- playlist2 = Node(('Dreams', 'Solange'), Node(('First', 'Gallant')))
- a = 2, b = 3
Output:
- ('Flea', 'St. Vincent') -> ('Juice', 'Lizzo') -> ('Dreams', 'Solange') -> ('First', 'Gallant') -> ('Empty', 'Kevin Abstract')
Explanation:
- The segment from index 2 to 3 in playlist1 (i.e., ('Tenderness', 'Jay Som') -> ('Ego Death', 'The Internet')) is removed.
- playlist2 is inserted in its place.
EDGE CASE
Input:
- playlist1 = Node(('Flea', 'St. Vincent'))
- playlist2 = Node(('Dreams', 'Solange'), Node(('First', 'Gallant')))
- a = 0, b = 0
Output:
- ('Dreams', 'Solange') -> ('First', 'Gallant')
Explanation:
- The entire playlist1 is replaced by playlist2.
Match what this problem looks like to known categories of problems, e.g. Linked List or Dynamic Programming, and strategies or patterns in those categories.
For Linked List problems involving Merging and Segment Removal, we want to consider the following approaches:
a-1
and b
.Plan the solution with appropriate visualizations and pseudocode.
General Idea: We will traverse playlist1
to find the node at position a-1
(just before the segment to be removed) and the node at position b
. We will then splice playlist2
in between, connecting the last node of playlist2
to the node after position b
.
1) Initialize a pointer `prev_a` to `playlist1` and move it to the `(a-1)`th position.
2) Initialize another pointer `node_b` to the same node and move it to the `b`th position.
3) Connect the `next` pointer of `prev_a` to the head of `playlist2`.
4) Traverse `playlist2` to find its last node.
5) Connect the last node of `playlist2` to `node_b.next`.
6) Return the modified `playlist1`.
⚠️ Common Mistakes
a = 0
(i.e., when replacing the head of playlist1
).Implement the code to solve the algorithm.
class Node:
def __init__(self, value, next=None):
self.value = value
self.next = next
def merge_playlists(playlist1, playlist2, a, b):
# Step 1: Find the (a-1)th node, i.e., the node before 'a'
prev_a = playlist1
for _ in range(a - 1):
prev_a = prev_a.next
# Step 2: Find the bth node
node_b = prev_a
for _ in range(b - a + 2): # Moving b-a+1 steps to land on the bth node
node_b = node_b.next
# Step 3: Connect prev_a to the head of playlist2
prev_a.next = playlist2
# Step 4: Traverse to the end of playlist2
current = playlist2
while current.next:
current = current.next
# Step 5: Connect the last node of playlist2 to the node after b
current.next = node_b
return playlist1
Review the code by running specific example(s) and recording values (watchlist) of your code's variables along the way.
playlist1
and playlist2
linked lists with the values of a
and b
to verify that the function correctly merges the playlists.Evaluate the performance of your algorithm and state any strong/weak or future potential work.
Assume N
represents the length of playlist1
and M
represents the length of playlist2
.
O(N + M)
because we traverse up to a-1
nodes in playlist1
, traverse up to b-a+1
nodes in playlist1
, and traverse the entire playlist2
.O(1)
because the algorithm uses a constant amount of extra space for pointers.