合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。
示例:
輸入:[1
->4-
>5,
1->3-
>4,
2->6]
輸出:1
->1-
>2-
>3-
>4-
>4-
>5-
>
6
兩兩合併
/**
* definition for singly-linked list.
* struct listnode
* };
*/class
solution
return head;
}private
: listnode*
merge
(listnode* list1,listnode* list2)
else}if
(p1)
p->next=p1;
if(p2)
p->next=p2;
return head-
>next;}}
;
提交結果:
執行結果:通過
顯示詳情
執行用時 :
172 ms, 在所有 cpp 提交中擊敗了28.36
%的使用者
記憶體消耗 :
11 mb, 在所有 cpp 提交中擊敗了91.42
%的使用者
分治演算法
遞迴實現
參考:新增鏈結描述
/**
* definition for singly-linked list.
* struct listnode
* };
*/class
solution
if(lists.
size()
==1)return
merge
(lists,
0,lists.
size()
-1);
}private
: listnode*
merge
(vector>
& lists,
int s,
int e)
int mid=
(e-s)/2
+s; listnode *left=
merge
(lists,s,mid)
; listnode *right=
merge
(lists,mid+
1,e)
;return
mergetwo
(left,right);}
listnode*
mergetwo
(listnode* list1,listnode* list2)
else}}
;
執行結果:通過
顯示詳情
執行用時 :
32 ms, 在所有 cpp 提交中擊敗了81.00
%的使用者
記憶體消耗 :
11.1 mb, 在所有 cpp 提交中擊敗了84.90
%的使用者
貪心策略
貪心策略:區域性最優–>全域性最優
/**
* definition for singly-linked list.
* struct listnode
* };
*/class
solution
//尋找頭節點的值最小的鍊錶
for(
int i=
1;isize()
;++i)
}//鏈結在結果鍊錶中
p->next=lists[min]
; p=p-
>next;
lists[min]
=lists[min]
->next;
}return head-
>next;}}
;
執行結果:通過
顯示詳情
執行用時 :
768 ms, 在所有 cpp 提交中擊敗了5.07
%的使用者
記憶體消耗 :
10.8 mb, 在所有 cpp 提交中擊敗了96.16
%的使用者
分治實現LeetCode 23題 合併K個排序鍊錶
紀念第一道沒有看題解做出來的困難題 分治思想 歸併排序實現合併k個排序鍊錶 由於是實現一連串已經排序的鍊錶,所以第一時間想到了歸併排序 又由於是實現多個鍊錶的總排序,為了減少時間複雜度又想到了分治思想,這一題中也就是二分法 做了這麼多天的題總算有點進步 class solution 結果陣列的頭結點...
LeetCode 23 合併 K個排序序列
合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 解題思路 採用分治的思想,將 k 個鍊錶的合併問題轉換成,合併 2 個有序鍊錶的問題 typedef struct listnode list 定...
Leetcode23 合併K個排序鍊錶
題目 解題思路 這道題使用的是分治演算法。首先還用輔助函式mergetwolists 用來合併兩個有序單鏈表,不申請額外的空間實現原地合併。如下 listnode mergetwolists listnode l1,listnode l2 else head nexthead while l1 nu...