题目:
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
分析:我想的办法就比较平常了,时间复杂度为(O(k * n))
大体就是每两个链表进行一次合并,当然主义的问题就是边界条件,还有几个判断返回的条件
代码:
/**
* 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) {
ListNode *L = NULL , *l ;
//无链表输入,直接返回L
if(lists.size() == 0) return L;
//只输入了一个链表,直接返回即可
if(lists.size() == 1) return lists[0] ;
for(int i = 0 ; i < lists.size() - 1 ; ){
//若链表为空,则i++依次向后判断
while(i < lists.size() - 1 && lists[i] == NULL) i ++ ;
//当i指向最后一个链表时,判断最后一个是否为空
//是则证明数组中每个链表都是空的,返回L
//若不为空,则证明数组中只有最后一个链表非空,直接返回即可
if(i == lists.size() - 1){
if(lists[i] == NULL)
return L ;
else
return lists[i] ;
}
//j相当于另一个指针,与i指向的链表相合并
int j = i + 1 ;
while(j < lists.size() && lists[j] == NULL) j ++ ;
//若j在判断链表是否为空的过程中指向了数组之外
//证明从i指向的位置之后的链表均为空,返回i指向的链表即可
if(j == lists.size())
return lists[i] ;
L = lists[i]->val < lists[j]->val ? lists[i] : lists[j] ;
lists[i]->val < lists[j]->val ? lists[i] = lists[i]->next : lists[j] = lists[j]->next ;
l = L ;
while(lists[i] != NULL && lists[j] != NULL){
if(lists[i]->val <= lists[j]->val){
l->next = lists[i] ;
l = l->next ;
lists[i] = lists[i]->next ;
}
else{
l->next = lists[j] ;
l = l->next ;
lists[j] = lists[j]->next ;
}
}
if(lists[i]) l->next = lists[i] ;
if(lists[j]) l->next = lists[j] ;
lists[j] = L ;
i = j;
}
return L ;
}
};