Merging sorted lists is a common problem in programming, often encountered in algorithms and interview questions. While Python provides tools like sorted()
and libraries to simplify the process, understanding how to merge two sorted lists manually can deepen your programming knowledge. This article explains the most efficient way to achieve this without using sorted()
or external libraries. We’ll focus on clarity and simplicity, providing step-by-step guidance.
Problem Overview
You’re given two lists, list1
and list2
, which are already sorted in ascending order. Your goal is to merge these two lists into a single sorted list efficiently, maintaining the sorted order.
Key Constraints:
- No use of
sorted()
or any external libraries. - The solution should ideally run in O(n) time complexity, where
n
is the total number of elements in both lists.
Approach: Two-Pointer Technique
The two-pointer technique is an efficient way to merge sorted lists. It involves:
- Comparing the smallest unprocessed elements of both lists.
- Adding the smaller element to the result list.
- Moving the pointer forward in the respective list.
Why Two Pointers?
This approach takes advantage of the fact that both lists are already sorted. By sequentially comparing elements, we avoid the need for nested loops, reducing time complexity to O(n).
Step-by-Step Implementation
Here’s how you can merge two sorted lists using the two-pointer technique:
def merge_sorted_lists(list1, list2):
# Initialize pointers and result list
i, j = 0, 0
merged_list = []
# Compare elements from both lists and merge
while i < len(list1) and j < len(list2):
if list1[i] < list2[j]:
merged_list.append(list1[i])
i += 1
else:
merged_list.append(list2[j])
j += 1
# Add remaining elements from list1 or list2
while i < len(list1):
merged_list.append(list1[i])
i += 1
while j < len(list2):
merged_list.append(list2[j])
j += 1
return merged_list
# Example usage
list1 = [1, 3, 5]
list2 = [2, 4, 6]
result = merge_sorted_lists(list1, list2)
print("Merged List:", result)
How the Code Works
- Initialization:
i
andj
are pointers forlist1
andlist2
, starting at index 0.merged_list
is an empty list that will store the final merged result.
- Comparison Loop:
- The
while
loop runs as long as neither pointer has reached the end of its respective list. - At each step, the smaller element between
list1[i]
andlist2[j]
is appended tomerged_list
, and the corresponding pointer is incremented.
- The
- Handle Remaining Elements:
- If one list is fully processed before the other, the remaining elements of the unprocessed list are added directly to
merged_list
.
- If one list is fully processed before the other, the remaining elements of the unprocessed list are added directly to
Efficiency
This approach ensures:
- Time Complexity: O(n), where
n = len(list1) + len(list2)
. - Space Complexity: O(n), as the result list requires additional space.
Example Walkthrough
Let’s merge [1, 3, 5]
and [2, 4, 6]
.
- Initialize
i = 0
,j = 0
,merged_list = []
. - Compare
list1[0] (1)
withlist2[0] (2)
:- Add
1
tomerged_list
, incrementi
.
- Add
- Compare
list1[1] (3)
withlist2[0] (2)
:- Add
2
tomerged_list
, incrementj
.
- Add
- Continue comparing and appending:
3, 4, 5, 6
. - Result:
[1, 2, 3, 4, 5, 6]
.
Edge Cases:
- One or both lists are empty: Ensure the remaining list is appended to the result.
- Lists with duplicate values: The method handles this seamlessly by comparing elements as usual.
Avoid Common Mistakes:
- Ensure both
i
andj
are incremented appropriately. - Don’t forget to handle remaining elements after the main loop.
Why This Solution Works Well
By leveraging the two-pointer technique, this method achieves optimal efficiency for merging sorted lists in Python. It avoids unnecessary overhead from additional sorting functions or libraries while remaining easy to implement and debug.
Whether for learning or practical application, mastering this approach equips you with a foundational skill for handling sorted data effectively.