|
1 | 1 | // #Hard #Top_100_Liked_Questions #Top_Interview_Questions #Heap_Priority_Queue #Linked_List
|
2 | 2 | // #Divide_and_Conquer #Merge_Sort #Big_O_Time_O(k*n*log(k))_Space_O(log(k))
|
3 |
| -// #2023_08_29_Time_75_ms_(97.06%)_Space_47.3_MB_(98.42%) |
| 3 | +// #2023_10_09_Time_76_ms_(94.52%)_Space_47.9_MB_(84.35%) |
4 | 4 |
|
5 |
| -/** |
| 5 | +import { ListNode } from '../../com_github_leetcode/listnode' |
| 6 | + |
| 7 | +/* |
6 | 8 | * Definition for singly-linked list.
|
7 | 9 | * class ListNode {
|
8 | 10 | * val: number
|
|
13 | 15 | * }
|
14 | 16 | * }
|
15 | 17 | */
|
16 |
| -function mergeKLists(lists: Array<ListNode | null>): ListNode | null { |
17 |
| - if (lists.length === 0) { |
18 |
| - return null |
| 18 | +const merge2Lists = (list1: ListNode | null, list2: ListNode | null): ListNode | null => { |
| 19 | + if (!list1 || !list2) { |
| 20 | + return list1 || list2 |
19 | 21 | }
|
20 |
| - return mergeKListsRecursive(lists, 0, lists.length) |
21 |
| -} |
22 |
| - |
23 |
| -function mergeKListsRecursive(lists: Array<ListNode | null>, leftIndex: number, rightIndex: number): ListNode | null { |
24 |
| - if (rightIndex > leftIndex + 1) { |
25 |
| - const mid = Math.floor((leftIndex + rightIndex) / 2) |
26 |
| - const left = mergeKListsRecursive(lists, leftIndex, mid) |
27 |
| - const right = mergeKListsRecursive(lists, mid, rightIndex) |
28 |
| - return mergeTwoLists(left, right) |
29 |
| - } else { |
30 |
| - return lists[leftIndex] |
| 22 | + const tempHead = new ListNode() |
| 23 | + let current = tempHead |
| 24 | + let l1 = list1 |
| 25 | + let l2 = list2 |
| 26 | + while (l1 || l2) { |
| 27 | + if (!l1) { |
| 28 | + current.next = l2 |
| 29 | + break |
| 30 | + } |
| 31 | + if (!l2) { |
| 32 | + current.next = l1 |
| 33 | + break |
| 34 | + } |
| 35 | + if (l1.val < l2.val) { |
| 36 | + current.next = l1 |
| 37 | + l1 = l1.next |
| 38 | + } else { |
| 39 | + current.next = l2 |
| 40 | + l2 = l2.next |
| 41 | + } |
| 42 | + current = current.next |
31 | 43 | }
|
| 44 | + return tempHead.next |
32 | 45 | }
|
33 | 46 |
|
34 |
| -function mergeTwoLists(left: ListNode | null, right: ListNode | null): ListNode | null { |
35 |
| - if (left === null) { |
36 |
| - return right |
37 |
| - } |
38 |
| - if (right === null) { |
39 |
| - return left |
40 |
| - } |
41 |
| - let res: ListNode | null |
42 |
| - if (left.val <= right.val) { |
43 |
| - res = left |
44 |
| - left = left.next |
45 |
| - } else { |
46 |
| - res = right |
47 |
| - right = right.next |
48 |
| - } |
49 |
| - let node = res |
50 |
| - while (left !== null || right !== null) { |
51 |
| - if (right === null || left.val <= right.val) { |
52 |
| - node.next = left |
53 |
| - left = left.next |
54 |
| - } else { |
55 |
| - node.next = right |
56 |
| - right = right.next |
| 47 | +const mergeKLists = (lists: Array<ListNode | null>): ListNode | null => { |
| 48 | + while (lists.length > 1) { |
| 49 | + const mergedLists = [] |
| 50 | + for (let i = 0; i < lists.length; i += 2) { |
| 51 | + const list1 = lists[i] |
| 52 | + const list2 = lists[i + 1] ?? null |
| 53 | + mergedLists.push(merge2Lists(list1, list2)) |
57 | 54 | }
|
58 |
| - node = node.next |
| 55 | + lists = mergedLists |
59 | 56 | }
|
60 |
| - return res |
| 57 | + return lists[0] ?? null |
61 | 58 | }
|
62 | 59 |
|
63 | 60 | export { mergeKLists }
|
0 commit comments