【题解】
会归并排序吧?
就把这K个链表当成是K个数字就好。
然后做归并排序。
因为归并排序的时候本来就会有这么一个过程。
[l..mid]和[mid+1..r]这两段区间都是有序的了已经。
然后再把他们俩合并起来。
合并起来之后把这个链表直接放在这个区间的最左边那个位置就好
上一级的合并要用的时候就直接取这个区间最左边那个链表。
有个人关于时间复杂度的证明说的挺好的贴一下
【代码】
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: void merge(vector<ListNode*> &lists,int l,int r){ if (l>=r) return; int mid = (l+r)>>1; merge(lists,l,mid);merge(lists,mid+1,r); ListNode *temp = (ListNode *) malloc(sizeof(ListNode)); temp->next =NULL; ListNode *p = temp; ListNode *p1 = lists[l],*p2 = lists[mid+1]; while(p1 && p2){ if (p1->val<p2->val){ p->next = p1; p1 = p1->next; }else{ p->next = p2; p2 = p2->next; } p = p->next; } if (p2) p1 = p2; while (p1){ p->next = p1; p = p->next; p1 = p1->next; } lists[l] = temp->next; } ListNode* mergeKLists(vector<ListNode*>& lists) { if (lists.empty()) return NULL; int n = lists.size(); merge(lists,0,n-1); return lists[0]; } };