合併K個有序鍊錶

2021-08-18 01:38:22 字數 1440 閱讀 9267

public class _023_mergeklists 

} /**

* 堆中結點類

* * @author luzhen-work-pc

* */

private static class node implements comparable

@override

public int compareto(node o)

} /**

* 將k個有序鍊錶歸併成乙個鍊錶。

* 如果此結點所在鍊錶還有元素,那麼就將那個元素放入堆頂,維護堆,對應**①

* * 如:

* 1-3-5

* 2-4-6

* 2-3-5

* 當前堆:(1-0)-(2-1)-(2-2)

* 取出(1-0),鍊錶0中還有元素,將(3-0)取出,然後維護堆

* 當前堆:(2-1)-(3-0)-(2-2)

* * 如果此結點所在鍊錶中沒有剩餘元素,那麼從剩餘鍊錶(還有剩餘元素的)中找到下乙個合適的(當前未加入堆的最小元素)

* 加入到堆頂,維護堆,然後移動指標,對應**②

* * 如:

* 1-2-3

* 4-5-6

* 7-8-9

* 當前堆:(1-0)-(4-1)-(7-2)

* 取出(1-0),加入(2-0);取出(2-0),加入(3-0),取出(3-0),此時鍊錶0為空

* 那麼需要找出鍊錶1和鍊錶2當前頭結點下乙個結點中的最小值,這裡就是鍊錶1中的5,將其加入到堆頂,然後維護堆

* * @param lists

* @return

*/private static listnode mergeklists(listnode lists) else

} buildheap(minheap);

listnode dummy = new listnode(0), curr = dummy; // 維護乙個歸併後鍊錶的虛頭結點dummy,用來返回,curr用來構建鍊錶

while (!stop) else

}if (!stop)

}} for (int i = 0; i < lists.length - 1; i++)

return dummy.next;

} private static void buildheap(node nodes)

private static void heapify(node nodes, int i) }

public static void main(string args) );

printlist(res);

} private static void printlist(listnode l)

system.out.println();

}}

合併k個有序鍊錶

這是leetcode上面的一道程式設計題,題目如下 合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 利用遞迴分治的思想將k個有序鍊錶的合併問題,分解成多個合併兩個有序鍊錶的問題。比如示例中我們將三...

合併k個有序鍊錶

題幹 合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 此題為leetcode中23題。由於此前有合併兩個有序鍊錶的經驗,開始看到這個題,很自然就想到了,每次在k個鍊錶中選取乙個最小的節點鏈結到結...

合併K個有序鍊錶O N lgK

問題 在o n lgk 時間內合併k個有序鍊錶,這裡n指的是k個鍊錶中所有的元素個數。這題的思路如下 1 在每乙個鍊錶中取出第乙個值,然後把它們放在乙個大小為k的陣列裡,然後把這個陣列當成heap,然後把該堆建成最小堆。o k 2 取出堆中的最小值 也是陣列的第乙個值 然後把該最小值所處的鍊錶的下乙...