You are given an array of k
linked-lists lists
, each linked-list is sorted in ascending order.
Merge all the linked-lists into one sorted linked-list and return it.
Test Cases
Example 1:
Input: lists = [[1,4,5],[1,3,4],[2,6]]
Output: [1,1,2,3,4,4,5,6]
Explanation: The linked-lists are:
[
1->4->5,
1->3->4,
2->6
]
merging them into one sorted list:
1->1->2->3->4->4->5->6
Example 2:
Input: lists = []
Output: []
Example 3:
Input: lists = [[]]
Output: []
Constraints:
-
k == lists.length
-
0 <= k <= 10<sup>4</sup>
-
0 <= lists[i].length <= 500
-
-10<sup>4</sup> <= lists[i][j] <= 10<sup>4</sup>
-
lists[i]
is sorted in ascending order. -
The sum of
lists[i].length
will not exceed10<sup>4</sup>
.
Solution
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
struct compare {
bool operator()(const ListNode* l, const ListNode* r) {
return l->val > r->val;
}
};
public:
ListNode *mergeKLists(vector<ListNode *> &lists) {
priority_queue<ListNode *, vector<ListNode *>, compare> q;
for (auto l : lists) {
if (l) {
q.push(l);
}
}
if (q.empty()) {
return NULL;
}
ListNode* result = q.top();
q.pop();
if (result->next) {
q.push(result->next);
}
ListNode* tail = result;
while (!q.empty()) {
tail->next = q.top();
q.pop();
tail = tail->next;
if (tail->next) {
q.push(tail->next);
}
}
return result;
}
};
/**
* 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.length == 0) return null;
PriorityQueue<ListNode> pq = new PriorityQueue<>((a, b) -> a.val - b.val);
for(int i=0; i<lists.length; i++) {
if (lists[i] != null) pq.offer(lists[i]);
}
ListNode head = new ListNode();
ListNode temp = head;
while(!pq.isEmpty()) {
ListNode top = pq.poll();
if (top.next != null) pq.offer(top.next);
top.next = null;
temp.next = top;
temp = temp.next;
}
return head.next;
}
}