leetcode 23 合併K個排序鍊錶

2021-09-17 18:21:30 字數 1459 閱讀 6256

題目描述:

合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。

示例:

輸入:

[ 1->4->5,

1->3->4,

2->6

]輸出: 1->1->2->3->4->4->5->6

解題思路:

你是否還記得這道題的簡單版本《leetcode 21.合併兩個有序鍊錶》。對這道題的思路就是將21延伸一下。我們使用歸併排序的思想,將多個鍊錶拆分開。最後變成兩個兩個鍊錶去合併,結果就出來啦。

class

solution

vector> l2;

l2.resize

(lists.

size()

- mid)

;for

(size_t i = mid; i < lists.

size()

; i++

)return

merge2lists

(mergeklists

(l1)

,mergeklists

(l2));

}

listnode*

merge2lists

(listnode *l1, listnode *l2)

else

return head;}}

;

解題思路:

c++stl庫里有乙個容器priority_queue這是乙個優先佇列。它實際就是乙個堆的容器。那麼這道題我們可以用這個容器先將所有的結點插入,然後該容器會自動構件乙個堆。我們只需要寫乙個lambda表示式來進行比較,來讓它構件乙個小堆。之後每次取堆頂結點連起來就行。

/**

* definition for singly-linked list.

* struct listnode

* };

*/class

solution

; priority_queue, vector>

,decltype

(cmp)

>

pq(cmp)

;for

(const

auto

& e : lists)

} listnode *head =

nullptr

; listnode *cur =

nullptr

;while

(!pq.

empty()

)else

}return head;}}

;

這個方法的難點就在於lambda表示式的應用。

分治實現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...