Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
bool cmp(const ListNode* a, const ListNode* b) {
return a->val > b->val;
}
class Solution {
public:
ListNode *mergeKLists(vector<ListNode *> &lists) {
ListNode* head, *cur;
auto it = remove_if(lists.begin(), lists.end(), [](const ListNode* a) {return a == NULL;});
lists.erase(it, lists.end());
make_heap(lists.begin(), lists.end(), cmp);
if (lists.size() == 0) return NULL;
pop_heap(lists.begin(), lists.end(), cmp);
auto end = lists.end() - 1;
head = *end;
*end = head->next;
if (*end == NULL) {
lists.erase(lists.end()-1);
} else {
push_heap(lists.begin(), lists.end(), cmp);
}
cur = head;
while (!lists.empty()) {
pop_heap(lists.begin(), lists.end(), cmp);
auto end2 = lists.end() - 1;
cur->next = *end2;
cur = cur->next;
*end2 = cur->next;
if (*end2 == NULL) {
lists.erase(lists.end()-1);
} else {
push_heap(lists.begin(), lists.end(), cmp);
}
}
return head;
}
};