Merge Sort II - codepath/compsci_guides GitHub Wiki
Unit 7 Session 2 (Click for link to problem statements)
Problem Highlights
- 💡 Difficulty: Medium
- ⏰ Time to complete: 20 mins
- 🛠️ Topics: Divide and Conquer, Recursion, Sorting Algorithms
1: U-nderstand
Understand what the interviewer is asking for by using test cases and questions about the problem.
- Established a set (2-3) of test cases to verify their own solution later.
- Established a set (1-2) of edge cases to verify their solution handles complexities.
- Have fully understood the problem and have no clarifying questions.
- Have you verified any Time/Space Constraints for this problem?
- Q: How should
merge()
handle arrays of different lengths?- A:
merge()
should be able to merge two sublists of different lengths seamlessly, adding remaining elements from the longer sublist once comparisons are complete.
- A:
HAPPY CASE
Input: left = [1,3,5], right = [2,4,6]
Output: [1,2,3,4,5,6]
Explanation: The sublists are merged into a single sorted list.
EDGE CASE
Input: left = [1,2,3], right = []
Output: [1,2,3]
Explanation: Since one of the sublists is empty, the merge simply returns the non-empty sublist.
2: M-atch
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.
This problem is a foundational component of the merge sort algorithm:
- Understanding how to merge two sorted lists is essential for implementing the full merge sort algorithm.
3: P-lan
Plan the solution with appropriate visualizations and pseudocode.
General Idea: Develop a function merge()
that combines two sorted sublists into one sorted list.
1) Initialize an empty list `result`.
2) Use two pointers to track the current index of each sublist (`i` for `left`, `j` for `right`).
3) Compare elements from both sublists and append the smaller one to `result`.
4) If one sublist is exhausted, append the remainder of the other sublist to `result`.
5) Return the `result` list.
⚠️ Common Mistakes
- Not handling the remaining elements in one of the sublists after the main comparisons are done.
- Failing to maintain the order when merging, leading to an incorrectly sorted result.
4: I-mplement
Implement the code to solve the algorithm.
def merge(left, right):
i, j = 0, 0
result = []
while i < len(left) and j < len(right):
if left[i] < right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
result.extend(left[i:]) # Append remaining elements from left if any
result.extend(right[j:]) # Append remaining elements from right if any
return result
5: R-eview
Review the code by running specific example(s) and recording values (watchlist) of your code's variables along the way.
- Test the function with inputs [1,3,5] and [2,4,6] to ensure it merges correctly to [1,2,3,4,5,6].
- Check with one empty input [1,2,3] and [] to confirm it returns [1,2,3].
6: E-valuate
Evaluate the performance of your algorithm and state any strong/weak or future potential work.
- Time Complexity:
O(n + m)
wheren
andm
are the lengths of the two sublists, since every element in each list is processed once. - Space Complexity:
O(n + m)
for the space needed to hold theresult
list.