/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param lists ListNode类vector
* @return ListNode类
*/
ListNode* mergeKLists(vector<ListNode*>& lists) {
// write code here
ListNode* head = nullptr;
int k = lists.size();
if (k >= 2) {
int mid = k / 2;
std::vector<ListNode*> leftLists;
leftLists.resize(mid);
std::vector<ListNode*> rightLists;
rightLists.resize(k-mid);
copy(lists.begin(), lists.begin() + mid, leftLists.begin());
copy(lists.begin() + mid, lists.end(), rightLists.begin());
return merge2Lists(mergeKLists(leftLists), mergeKLists(rightLists));
}else if (k == 1) {
return lists[0];
}
return nullptr;
}
ListNode* merge2Lists(ListNode* left, ListNode* right) {
if (left == nullptr) {
return right;
}
if (right == nullptr) {
return left;
}
ListNode* head = nullptr;
ListNode* currentHead = nullptr;
while (left != nullptr and right != nullptr) {
ListNode* smallerNode = left->val <= right->val ? left : right;
if (currentHead != nullptr) {
currentHead->next = smallerNode;
} else {
head = smallerNode;
}
currentHead = smallerNode;
if (left->val <= right->val) {
left = left->next;
} else {
right = right->next;
}
}
if (left == nullptr) {
currentHead->next = right;
} else {
currentHead->next = left;
}
return head;
}
};