From e37b949c18ba90de8ac52a5415be6d45995d6364 Mon Sep 17 00:00:00 2001 From: pro100ton Date: Wed, 19 Feb 2025 22:33:26 +0300 Subject: [PATCH] Add solution for neetcode: merge k sorted linked lists --- .../linked_list/merge_k_sorted_ll/README.md | 25 +++++++++ .../linked_list/merge_k_sorted_ll/solution.py | 55 +++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 neetcode/linked_list/merge_k_sorted_ll/README.md create mode 100644 neetcode/linked_list/merge_k_sorted_ll/solution.py diff --git a/neetcode/linked_list/merge_k_sorted_ll/README.md b/neetcode/linked_list/merge_k_sorted_ll/README.md new file mode 100644 index 0000000..0d55440 --- /dev/null +++ b/neetcode/linked_list/merge_k_sorted_ll/README.md @@ -0,0 +1,25 @@ +Merge K Sorted Linked Lists +You are given an array of k linked lists lists, where each list is sorted in ascending order. + +Return the sorted linked list that is the result of merging all of the individual linked lists. + +Example 1: + +Input: lists = [[1,2,4],[1,3,5],[3,6]] + +Output: [1,1,2,3,3,4,5,6] +Example 2: + +Input: lists = [] + +Output: [] +Example 3: + +Input: lists = [[]] + +Output: [] +Constraints: + +0 <= lists.length <= 1000 +0 <= lists[i].length <= 100 +-1000 <= lists[i][j] <= 1000 diff --git a/neetcode/linked_list/merge_k_sorted_ll/solution.py b/neetcode/linked_list/merge_k_sorted_ll/solution.py new file mode 100644 index 0000000..b0297cf --- /dev/null +++ b/neetcode/linked_list/merge_k_sorted_ll/solution.py @@ -0,0 +1,55 @@ +from typing import List, Optional + + +# Definition for singly-linked list. +class ListNode: + def __init__(self, val=0, next=None): + self.val = val + self.next = next + + +class Solution: + def merge2lists(self, l1: ListNode, l2: ListNode) -> ListNode: + dummy = node = ListNode() + while l1 and l2: + if l1.val < l2.val: + node.next = l1 + l1 = l1.next + else: + node.next = l2 + l2 = l2.next + node = node.next + + node.next = l1 or l2 + + return dummy.next + + def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]: + if len(lists) == 0 or not lists: + return None + if len(lists) == 1: + return lists[0] + middle = int(len(lists) / 2) + breakpoint() + left_side = self.mergeKLists(lists[0:middle]) + right_side = self.mergeKLists(lists[middle:]) + + return self.merge2lists(left_side, right_side) + + +if __name__ == "__main__": + s = Solution() + e3 = ListNode(3, None) + e2 = ListNode(2, e3) + e1 = ListNode(1, e2) + + k3 = ListNode(5, None) + k2 = ListNode(3, k3) + k1 = ListNode(2, k2) + k0 = ListNode(0, k1) + + s= Solution() + k = s.mergeKLists([e1, k0]) + while k: + print(f"{k.val}") + k = k.next