23 合併K個排序鍊錶

2021-09-27 11:16:07 字數 1261 閱讀 3547

題目.

很有意思

第一想法就是使用最小堆或者比較樹,這個方法當然是可以的,但是用go語言難寫,尤其是比較樹。採用歸併排序的思想倒是很快,每次比較都需要比較o(n)次,一共log2k次

package main

import

("fmt"

)type listnode struct

func

printlist

(root *listnode)

} fmt.

println

("....")}

func

merge2lists

(l1, l2 *listnode)

*listnode

if l2 ==

nil head :=

&listnode

tail := head

for l1 !=

nil&& l2 !=

nilelse

}if l1 !=

nilif l2 !=

nilreturn head.next

}func

mergeklists

(lists [

]*listnode)

*listnode

iflen

(lists)==1

merged :=

make([

]*listnode,0,

len(lists)/2

+1)for i :=

0; i <

len(lists)

; i = i +

2else

}return

mergeklists

(merged)

}func

main()

,},}

l2 :=

&listnode,}

,}l3 :=

&listnode,}

printlist

(l1)

printlist

(l2)

printlist

(l3)

printlist

(mergeklists([

]*listnode))

}

o(log2k*n)

o(k)

執行用時 :12 ms, 在所有 go 提交中擊敗了93.50%的使用者

記憶體消耗 :5.4 mb, 在所有 go 提交中擊敗了81.33%的使用者

23 合併K個排序鍊錶

合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 偷懶直接複製了以前的堆的 所有看上去長了點 class priorityqueue priority是設定優先順序 true為大根堆 false為...

23 合併K個排序鍊錶

合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。採用分治法的思想,將 k 個排序鍊錶先合併為 k 2 個鍊錶。依次迴圈,直至合併為1個鍊錶為止。注意 從 k 到 k 2 時,如何定義索引,將每兩個鍊錶合併,而且必須符合奇數 偶數個鍊錶的情況。解決辦法 k n 1 2 list...

23 合併K個排序鍊錶

合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 暴力法 將所有的節點放在乙個陣列中,然後對陣列排序,最後遍歷陣列,組建新的鍊錶。definition for singly linked list...