/**
* definition for listnode.
* public class listnode
* }* 但是不管合併幾個,基本還是要兩兩合併。那麼我們首先考慮的方法是能不能利用之前那道題的解法來解答此題。答案是肯定的,但是需要修改,怎麼修改呢,最先想到的就是兩兩合併,就是前兩個先合併,合併好了再跟第三個,然後第四個直到第k個。這樣的思路是對的,但是效率不高,沒法通過oj,
* 所以我們只能換一種思路,這裡就需要用到分治法
* 簡單來說就是不停的對半劃分,
* 比如k個鍊錶先劃分為合併兩個k/2個鍊錶的任務,再不停的往下劃分,直到劃分成只有乙個或兩個鍊錶的任務,開始合併。
* 舉個例子來說比如合併6個鍊錶,那麼按照分治法,我們首先分別合併1和4,2和5,3和6。這樣下一次只需合併3個鍊錶,我們再合併1和3,最後和2合併就可以了
* *
* 類似於歸併排序的思想,lists中存放的是多個單鏈表,將lists的頭和尾兩個鍊錶合併,放在頭,頭向後移動,尾向前移動,繼續合併,直到頭和尾相等,此時已經歸併了一半, 然後以同樣的方法又重新開始歸併剩下的一半。時間複雜度是o(logn),合併兩個鍊錶的時間複雜度是o(n),則總的時間複雜度大概是o(nlogn);
*/ //分治法
public class solution
return mergehelper(lists, 0, lists.size() - 1);
}private listnode mergehelper(listlists, int start, int end)
int mid = (end +start) / 2;
listnode left = mergehelper(lists, start, mid);//不斷劃分
listnode right = mergehelper(lists, mid + 1, end);
return mergetwolists(left, right);
}private listnode mergetwolists(listnode list1, listnode list2) else
}if (list1 != null) else
return dummy.next;}}
/*按照前面實現的合併兩個排序的鍊錶的方法,兩兩合併,如果是奇數個,最後記得再合併最後乙個即可。
*/public class solution
while (lists.size() > 1)
if (lists.size() % 2 == 1)
lists = new_lists;
}return lists.get(0);
}private listnode merge(listnode a, listnode b) else
tail = tail.next;
}if (a != null) else
return dummy.next;}}
lintcode 合併k個排序鍊錶
合併k個排序鍊錶 合併k個排序鍊錶,並且返回合併後的排序鍊錶。嘗試分析和描述其複雜度。您在真實的面試中是否遇到過這個題?yes 樣例給出3個排序鍊錶 2 4 null,null,1 null 返回 1 2 4 null 標籤 推特 領英鍊錶 愛彼迎臉書 優先佇列 分治法堆 優步谷歌 相關題目 分析 ...
合併k個排序鍊錶
合併k個排序鍊錶,並且返回合併後的排序鍊錶。嘗試分析和描述其複雜度。樣例 給出3個排序鍊錶 2 4 null,null,1 null 返回 1 2 4 null 兩兩合併 合併ab得到c 合併cd得到e definition for listnode.public class listnode pu...
合併K個排序鍊錶
從21.合併兩個有序鍊錶的基礎上,我們已經能夠解決兩個有序鍊錶的問題,現在是k個有序鍊錶,我們可以將第一二個有序鍊錶進行合併,然後將新的有序鍊錶再繼續跟第三個有序鍊錶合併,直到將所有的有序鍊錶合併完成。這樣做思路上是可行的,但是演算法的時間複雜度將會很大,具體就不計算了。有興趣的自己計算下。根據思路...