/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
        if(pHead1==nullptr)
        return pHead2;
        if(pHead2==nullptr)
        return pHead1;
        ListNode* dummy=new ListNode(-1);
        ListNode* cur=dummy;
        ListNode* cur1=pHead1;
        ListNode* cur2=pHead2;
        while(cur1!=nullptr&&cur2!=nullptr)
        {
            if(cur1->val>=cur2->val)
            {
                cur->next=cur2;
                cur2=cur2->next;
            }
            else
            {
                cur->next=cur1;
                cur1=cur1->next;
            }
            cur=cur->next;
        }
        if(cur1==nullptr)
        {
            cur->next=cur2;
        }
        if(cur2==nullptr)
        {
            cur->next=cur1;
        }
        return dummy->next;
    }
    ListNode* divideMerge(vector<ListNode*>& lists,int l,int r)
    {
        if(l>r)
        return nullptr;
        else if(l==r)
        return lists[l];
        int m=(l+r)/2;
        return Merge(divideMerge(lists,l,m),divideMerge(lists,m+1,r));
    }
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        return divideMerge(lists,0,lists.size()-1);
    }
};

归并排序