題目地址:https://leetcode.com/problems/merge-k-sorted-lists/?tab=Description
題目描述:Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
我的代碼:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.size()==0) return NULL;
while(lists.size()>1){
ListNode* a0=lists[0];
ListNode* a1=lists[1];
ListNode* a;
if(a0==NULL||(a1!=NULL&&a0->val>a1->val)){
a=a0;
a0=a1;
a1=a;
}
a=a0;
if(a0!=NULL) a0=a0->next;
lists.push_back(a);
while(a0!=NULL){
while(a1!=NULL&&a1->val<=a0->val){
a->next=a1;
a=a->next;
a1=a1->next;
}
a->next=a0;
a=a->next;
a0=a0->next;
}
if(a!=NULL) a->next=a1;
lists[0]=NULL;lists[1]=NULL;
lists.erase(lists.begin(),lists.begin()+2);
}
return lists[0];
}
};
解題思路:
對於k個鏈表,將其兩兩分組,每次對[k+1]/2組做兩個鏈表的合併即可。
由於使用的是vector,所以這一步就想當於每次將前兩個鏈表合併後放到末尾。直到僅剩1個鏈表。
因爲鏈表是有序的,所以可直接順序比較將兩個鏈表合併。
由於存在空鏈表的情況,所以需小心判斷。
設最後鏈表元素個數爲n個,由於鏈表數沒減少一半,就需遍歷所有的元素一次,因此複雜度爲O(nlogk)。