Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # 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:
- # to keep original lists because I will use `.pop()`
- 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:
- # to keep original list because I will use `.pop()`
- 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))
- # check if original lists still exist (so `.pop()` didn't change them)
- print(f"{a = }")
- print(f"{b = }")
Advertisement
Add Comment
Please, Sign In to add comment