采用归并排序的套路,递归将lists一直从中间拆分,直到不能再拆,在递归函数返回时,将拆分的两段list1[a:b]和list2[c:d]进行合并,合并结果保存在list1[a]中,这样,最终合并的结果在lists[0]中。

class Solution {
public:
    ListNode * merge2lists(ListNode *list1, ListNode *list2)
    {
        ListNode node(0);
        ListNode *p = &node;

        while (list1 && list2)
        {
            if (list1->val <= list2->val)
            {
                p->next = list1;
                p = p->next;
                list1 = list1->next;
            }
            else
            {
                p->next = list2;
                p = p->next;
                list2 = list2->next;
            }
        }

        if (list1)
        {
            p->next = list1;
        }

        if (list2)
        {
            p->next = list2;
        }

        return node.next;
    }
    
    void merge(vector<ListNode *> &lists, int beg, int end)
    {
        if (beg >= end)
        {
            return;
        }
        
        int m = (beg + end) / 2;
        merge(lists, beg, m);
        merge(lists, m + 1, end);

        ListNode *list1 = lists[beg];
        ListNode *list2 = lists[m + 1];
        lists[beg] = merge2lists(list1, list2);
    }
    
    ListNode *mergeKLists(vector<ListNode *> &lists) {
        if (lists.empty())
            return NULL;
        
        merge(lists, 0, lists.size() - 1);

        return lists[0];
    }
};