23. 合併K個元素的有序連結串列
合併K個有序連結串列,並且作為一個有序連結串列的形式返回。分析並描述它的複雜度。
思路:每兩個連結串列一合併,每一次規模縮減為原來的一半,直到最後剩兩個連結串列合併為一個連結串列。
複雜度分析: 第一次兩兩合併是進行了k/2次,每次處理2n個值。第二次兩兩合併是進行了k/4次,每次處理4n個值。。。。最後(設第x次)一次兩兩合併,進行了一次合併(k/(2^x)=1,求出x=logk),每次處理 n*k個值。
所以O(n)=nklogk,因為每個連結串列長度可能不一樣,nk就是所有連結串列總長度,因此O(n)=Nlogk(N為k個連結串列總長度)
方法1:用vector迭代來做。
class Solution {
public:
ListNode* mergeTwo(ListNode* l1, ListNode* l2)
{
if (!l1) return l2;
if (!l2) return l1;
ListNode *dummy = new ListNode(0), *head=dummy;
while (l1 && l2)
{
if (l1->val <= l2->val)
{
head->next = l1;
l1 = l1->next;
}
else
{
head->next = l2;
l2 = l2->next;
}
head = head->next;
}
if (l1)
head->next = l1;
if (l2)
head->next = l2;
return dummy->next;
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.empty()) return nullptr;
while(lists.size()>1){
vector<ListNode*> temp;
for(int i=1; i<lists.size(); i=i+2)
{
ListNode *p=mergeTwo(lists[i-1], lists[i]);
temp.push_back(p);
}
if(lists.size()%2==1) temp.push_back(lists.back());
lists=temp;
}
return lists.back();
}
};
方法2:迭代的部分用遞迴來處理
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.empty())
return nullptr;
vector<ListNode*> temp;
for(int i=1; i<lists.size(); i=i+2)
{
ListNode *p=mergeTwo(lists[i-1], lists[i]);
temp.push_back(p);
}
if(lists.size()%2==1)
temp.push_back(lists.back());
if(temp.size()==1)
return temp[0];
else
return mergeKLists(temp);
}
};
方法3:優先佇列來做
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.empty()) return nullptr;
queue<ListNode*>re;
while(!lists.empty()){
re.push(lists.back());
lists.pop_back();
}
while(re.size()>1){
ListNode* a=re.front();
re.pop();
ListNode* b=re.front();
re.pop();
re.push(mergeTwo(a, b));
}
return re.front();
}
};
相關文章
- LeetCode 23. 合併K個排序連結串列LeetCode排序
- 連結串列面試題(七)---合併兩個有序連結串列面試題
- [LeetCode] Merge k Sorted Lists 合併k個有序連結串列LeetCode
- 合併K個排序連結串列排序
- leetcode:21. 合併兩個有序連結串列(連結串列,簡單)LeetCode
- 【演算法-java實現】合併兩個有序連結串列演算法Java
- 每日leetcode——21. 合併兩個有序連結串列LeetCode
- LeetCode 之 JavaScript 解答第23題 —— 合併K個有序連結串列(Merge K Sorted Lists)LeetCodeJavaScript
- leecode.23. 合併K個升序連結串列
- 淺談歸併排序:合併 K 個升序連結串列的歸併解法排序
- Leetcode 21 合併兩個有序連結串列 學習感悟LeetCode
- 演算法基礎~連結串列~排序連結串列的合併(k條)演算法排序
- leetcode23. 合併K個排序連結串列LeetCode排序
- 【LeetCode Hot 100】21. 合併兩個有序連結串列LeetCode
- 02-線性結構1 兩個有序連結串列序列的合併 (15分)
- 資料結構實驗之連結串列四:有序連結串列的歸併資料結構
- 讓我們一起啃演算法----合併兩個有序連結串列演算法
- Fourth. LeetCode 21:MergeTwo Sorted Lists 合併兩個有序連結串列LeetCode
- 反轉連結串列、合併連結串列、樹的子結構
- 測試開發每日演算法 Leecode21. 合併兩個有序連結串列演算法
- 前端菜鳥的每週一道演算法題(三) 合併兩個有序連結串列前端演算法
- JZ-016-合併兩個排序的連結串列排序
- 劍指offer面試17 合併兩個排序的連結串列面試排序
- 資料結構實驗之連結串列六:有序連結串列的建立資料結構
- 0928面試小節:刪除有序連結串列中的重複元素面試
- Golang從合併連結串列聊遞迴Golang遞迴
- leetcode雙週賽(2)-合併兩個連結串列LeetCode
- K個節點翻轉連結串列
- [每日一題] 第十八題:合併兩個排序的連結串列每日一題排序
- 牛客網高頻演算法題系列-BM5-合併k個已排序的連結串列演算法排序
- 實戰資料結構(3)_兩個單連結串列間的合併操作資料結構
- 合併兩個有序陣列陣列
- 有a,b兩個已按學號升序排序的連結串列,每個連結串列中的結點包括學號、成績。要求把兩個連結串列合併,仍按學號升序排列。...排序
- 連結串列合併-排序-logo列印參考排序Go
- 劍指 Offer 25. 合併兩個排序的連結串列 JavaScript實現排序JavaScript
- (c語言實現)刪除有序連結串列中重複出現的元素C語言
- 連結串列面試題(五)---尋找連結串列的倒數第k個結點O(N)面試題
- 連結串列面試題(六)---刪除單連結串列倒數第k個結點面試題