一个一个合并列表
假如有4个列表a,b,c,d
先合并ab,然后abc,然后abcd;
定义一个merge函数合并两个列表,利用双指针,对两个列表进行归并排序
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
//两个列表合并函数
ListNode* mergeTwoLists(ListNode *a,ListNode *b){
// 如果a空或者b空 返回另一个链表
if((!a)||(!b)) return a?a:b;
// 定义头指针、尾指针,以及双指针a、b
ListNode head,*tail = &head,*aPtr = a,*bPtr=b;
// a、b都不为空,就一直循环
while(aPtr && bPtr){
if(aPtr->val < bPtr->val){
tail->next = aPtr;
aPtr = aPtr->next;
}else{
tail->next = bPtr;
bPtr = bPtr->next;
}
tail = tail->next;
}
// 一个链表已经空了,补齐另一个还没空链表元素进尾部
tail->next = (aPtr ? aPtr:bPtr);
return head.next;
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
ListNode *res = nullptr;
// 列表一个一个合并
for(int i = 0;i<lists.size();i++){
res = mergeTwoLists(res,lists[i]);
}
return res;
}
};
时间复杂度O(k^2 * n):k为列表数目,n是平均每个列表的元素个数
空间复杂度O(1)