/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
class Solution {
public:
//合并两个链表
ListNode* merge(ListNode* p1,ListNode* p2)
{
if(!p1 || !p2) return p1==nullptr ? p2 : p1;
auto head = new ListNode(0);
ListNode* cur = head;
while(p1 && p2)
{
if(p1->val <= p2->val){
cur->next = p1;
p1 = p1->next;
}
else{
cur->next = p2;
p2=p2->next;
}
cur = cur->next;
}
if(p1) cur->next = p1;
else cur->next = p2;
return head->next;
}
//合并left 到 right 范围内的链表
ListNode* dividemerge(vector<ListNode*>& lists,int left,int right)
{
if(left > right) return nullptr;
//left == right 说明只有一个链表,返回即可
else if(left == right) return lists[left];
//大于一个链表
else{
int mid = left + ((right-left)>>1);
//我让他左边去合并,合并好后返回头节点
ListNode* left_ok = dividemerge(lists,left,mid);
//我让他右边去合并,合并好后返回头节点
ListNode* right_ok = dividemerge(lists,mid+1,right);
//我再让 左边合并好的 和 右边合并好 合并一起,返回头节点
return merge(left_ok,right_ok);
}
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
// write code here
return dividemerge(lists,0,lists.size()-1);
}
};