题目描述
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;
return mergeKLists(lists, 0, lists.size() - 1);
}
private:
ListNode* mergeKLists(vector<ListNode*>& lists, int begin, int end){
if (begin < end){
int mid = (begin + end) >> 1;
return mergeTwoLists2(mergeKLists(lists, begin, mid), mergeKLists(lists, mid + 1, end));
}
else if (begin == end){
return lists.at(begin);
}
else{
return NULL;
}
}
ListNode* mergeTwoLists2(ListNode* headA, ListNode* headB){
if(headA == NULL)
return headB;
if(headB == NULL)
return headA;
ListNode newHead(-1);
ListNode * p3 = &newHead;
while(headA && headB){
if(headA->val <= headB->val){
p3->next = headA;
p3 = headA;
headA = headA->next;
}else{
p3->next = headB;
p3 = headB;
headB = headB->next;
}
}
p3->next = headA ? headA : headB;
return newHead.next;
}
};