diff --git a/java/23-Merge-k-Sorted-Lists.java b/java/23-Merge-k-Sorted-Lists.java index aac816fd0..a8087d2b6 100644 --- a/java/23-Merge-k-Sorted-Lists.java +++ b/java/23-Merge-k-Sorted-Lists.java @@ -1,5 +1,8 @@ -class Solution { +// Solution using Min Heap +// Time Complexity: O(n*log(k)) +// Extra Space Complexity: O(k) +class Solution1 { public ListNode mergeKLists(ListNode[] lists) { Queue minHeap = new PriorityQueue<>(); @@ -22,3 +25,50 @@ public ListNode mergeKLists(ListNode[] lists) { return dummy.next; } } + +// Solution using Iterative Merge Sort +// Time Complexity: O(n*log(k)) +// Extra Space Complexity: O(1) + +class Solution2 { + public ListNode mergeKLists(ListNode[] lists) { + int size = lists.length; + int interval = 1; + + while(interval < size) { + for(int i = 0; i < size - interval; i += 2 * interval) { + lists[i] = merge(lists[i], lists[i + interval]); + } + + interval *= 2; + } + + return size > 0? lists[0] : null; + } + + private ListNode merge(ListNode l1, ListNode l2) { + ListNode dummy = new ListNode(0); + ListNode curr = dummy; + + while(l1 != null && l2 != null) { + if (l1.val <= l2.val) { + curr.next = l1; + l1 = l1.next; + } else { + curr.next = l2; + l2 = l2.next; + } + + curr = curr.next; + } + + if (l1 != null) { + curr.next = l1; + } else { + curr.next = l2; + } + + return dummy.next; + + } +}