Repository navigation
Expand file tree
/
Copy path0023. Merge k Sorted Lists.java
More file actions
86 lines (72 loc) · 2.36 KB
/
Copy path0023. Merge k Sorted Lists.java
File metadata and controls
86 lines (72 loc) · 2.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
PriorityQueue<ListNode> minHeap = new PriorityQueue<>((a, b) -> a.val - b.val);
for (int i = 0; i < lists.length; i++) {
if (lists[i] != null) {
minHeap.add(lists[i]);
}
}
ListNode dummy = new ListNode(0);
ListNode tail = dummy;
while(!minHeap.isEmpty()) {
ListNode smallest = minHeap.poll();
tail.next = smallest;
tail = tail.next;
if (smallest.next != null) {
minHeap.add(smallest.next);
}
}
return dummy.next;
}
}
// SOLUTION 2: divide and conquer, merging pairs of lists
// /**
// * Definition for singly-linked list.
// * public class ListNode {
// * int val;
// * ListNode next;
// * ListNode() {}
// * ListNode(int val) { this.val = val; }
// * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
// * }
// */
// class Solution {
// public ListNode mergeKLists(ListNode[] lists) {
// if (lists == null || lists.length == 0) return null;
// return solve(lists, 0, lists.length - 1);
// }
// public ListNode mergeTwoLists(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;
// if (l2 != null) curr.next = l2;
// return dummy.next;
// }
// public ListNode solve(ListNode[] lists, int left, int right) {
// if (left == right) return lists[left];
// int mid = left + (right - left) / 2;
// ListNode l1 = solve(lists, left, mid);
// ListNode l2 = solve(lists, mid + 1, right);
// return mergeTwoLists(l1, l2);
// }
// }