Last active
August 3, 2022 01:48
-
-
Save Per48edjes/9078a04f71b0f50452ca2dc89f978135 to your computer and use it in GitHub Desktop.
Merge arbitrary number of ordered lists via recursion + reduction
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from functools import reduce | |
def merge(lst1, lst2): | |
"""Merges two sorted lists. | |
>>> s1 = [1, 3, 5] | |
>>> s2 = [2, 4, 6] | |
>>> merge(s1, s2) | |
[1, 2, 3, 4, 5, 6] | |
>>> s1 | |
[1, 3, 5] | |
>>> s2 | |
[2, 4, 6] | |
>>> merge([], [2, 4, 6]) | |
[2, 4, 6] | |
>>> merge([1, 2, 3], []) | |
[1, 2, 3] | |
>>> merge([5, 7], [2, 4, 6]) | |
[2, 4, 5, 6, 7] | |
>>> merge([2, 3, 4], [2, 4, 6]) | |
[2, 2, 3, 4, 4, 6] | |
""" | |
if not lst1 or not lst2: | |
return lst1 + lst2 | |
if lst1[0] < lst2[0]: | |
return [lst1[0]] + merge(lst1[1:], lst2) | |
else: | |
return [lst2[0]] + merge(lst1, lst2[1:]) | |
def merge_k_lists(*args): | |
"""Merges arbitrary number of ordered lists. | |
>>> s1 = [1, 3, 5] | |
>>> s2 = [2, 4, 6] | |
>>> s3 = [12, 14, 16] | |
>>> s4 = [13, 15, 17] | |
>>> s5 = [1, 10, 100, 1000] | |
>>> merge_k_lists([], [2, 4, 6], [1, 2, 3]) | |
[1, 2, 2, 3, 4, 6] | |
>>> merge_k_lists([1], [2], [3], [6, 28]) | |
[1, 2, 3, 6, 28] | |
>>> merge_k_lists(s1, s2, s3, s4, s5) | |
[1, 1, 2, 3, 4, 5, 6, 10, 12, 13, 14, 15, 16, 17, 100, 1000] | |
>>> s1 | |
[1, 3, 5] | |
>>> s4 | |
[13, 15, 17] | |
>>> s5 | |
[1, 10, 100, 1000] | |
""" | |
return reduce(lambda x, y: merge(x, y), args) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment