leetcode23 合併K個排序鍊錶

2021-10-01 18:04:38 字數 2310 閱讀 9170

合併 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...