# date: 2025.09.20
# [How can I efficiently merge two sorted lists in Python without using merge() or heapq? - Stack Overflow](https://stackoverflow.com/questions/79770326/how-can-i-efficiently-merge-two-sorted-lists-in-python-without-using-merge-or)
def merge_1(a: list, b: list) -> list:
a = a.copy()
b = b.copy()
result = []
while True:
if (not a) or (not b): # if one is empty (or both are empty)
# if a:
# result += a
# else:
# result += b
result += a + b
break
else:
if a[0] <= b[0]:
result.append(a.pop(0))
else:
result.append(b.pop(0))
return result
def merge_1b(a: list, b: list) -> list:
a = a.copy()
b = b.copy()
result = []
while a and b:
if a[0] <= b[0]:
result.append(a.pop(0))
else:
result.append(b.pop(0))
# if one of them is still not empty (or both are empty)
if a or b:
# if a:
# result += a
# else:
# result += b
result += a + b
# if a:
# result += a
# elif b:
# result += b
# # else: print('both empty')
return result
def merge_2(a: list, b: list) -> list:
len_a = len(a)
len_b = len(b)
index_a = 0
index_b = 0
result = []
while True:
if (index_a >= len_a) or (
index_b >= len_b
): # if one is empty (or both are empty)
# if index_a < len(a):
# result += a[index_a:]
# else:
# result += b[index_b:]
result += a[index_a:] + b[index_b:]
break
else:
if a[index_a] <= b[index_b]:
result.append(a[index_a])
index_a += 1
else:
result.append(b[index_b])
index_b += 1
return result
def merge_recursion(a: list, b: list) -> list:
# if (not a) and (not b): # if both are empty
# return []
# if not a:
# return b
# if not b:
# return a
if (not a) or (not b): # if one is empty (or both are empty)
# if a:
# return a
# else:
# return b
return a + b
# if a[0] <= b[0]:
# return [a[0]] + merge_recursion(a[1:], b)
# else:
# return [b[0]] + merge_recursion(a, b[1:])
head_a, *tail_a = a
head_b, *tail_b = b
if head_a <= head_b:
return [head_a] + merge_recursion(tail_a, b)
else:
return [head_b] + merge_recursion(a, tail_b)
a = [1, 2, 3, 7, 8, 9]
b = [1, 4, 6, 9, 12]
print(f"{a = }")
print(f"{b = }")
print(merge_1(a, b))
print(merge_2(a, b))
print(merge_recursion(a, b))
print(f"{a = }")
print(f"{b = }")