这个就是分治算法的一个实例。K个合并,先是两两合并,然后最后merge在一起。这里有两个trick,一个是用合并了的lsit替换合并的第一个.另外就是再size是奇数的处理,画一个实例图可解。
c++ 遗忘知识点:除法默认是向下取整,3/2 =1 。
分治算法: 分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题可用二分法完成。
分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题可用二分法完成。
class Solution {
public:
ListNode* MergeTwoLists(ListNode* l1, ListNode* l2){
ListNode* mergeTwo = new ListNode(-1);
ListNode* mergeTwo1 = mergeTwo;
while(l1 && l2){
if(l1->val < l2->val) {mergeTwo->next = l1; l1 = l1->next;}
else {mergeTwo->next = l2; l2 = l2->next;}
mergeTwo = mergeTwo->next;
}
while(l1) {mergeTwo->next = l1; l1 = l1->next;mergeTwo = mergeTwo->next;}
while(l2) {mergeTwo->next = l2; l2 = l2->next;mergeTwo = mergeTwo->next;}
return mergeTwo1->next;
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.size() == 0) return NULL;
if(lists.size() == 1) return lists[0];
ListNode* merge_all = new ListNode(0);
ListNode* merge_all1 = merge_all;
int length(lists.size());
while(length > 1){
for(int i = 0 ; i < length/2 ; i++){
lists[i] = MergeTwoLists(lists[i], lists[i+length/2]);
}
if(length %2){
lists[length/2] = lists[length-1];
length = length/2 +1;
}
else length = length /2;
}
return lists[0];
}
};