合併k個有序鍊錶

2021-10-05 03:05:28 字數 1471 閱讀 9863

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

示例:輸入:

[1->4->5,

1->3->4,

2->6

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

此題為leetcode中23題。由於此前有合併兩個有序鍊錶的經驗,開始看到這個題,很自然就想到了,每次在k個鍊錶中選取乙個最小的節點鏈結到結果中去,直到k個鍊錶每個都遍歷完成。 雖然通過了,但是很顯然這道題考察的解法不是這樣的。

聯想歸併排序,先將k個鍊錶分成兩組,然後將兩組的結果再合併。

於是可以先寫出乙個函式框架

mergerange(listnode a, int start, int end)
該函式實現為:

/**

* 將start和end範圍的鍊錶合併

* @param lists

* @param start

* @param end

* @return

*/private listnode mergerange(listnode lists, int start, int end)

int mid = (start + end) / 2;

listnode left = mergerange(lists, start, mid);

listnode right = mergerange(lists, mid + 1, end);

return mergetwolist(left, right); // 這個方法是將兩個有序鍊錶合併

}

兩個有序鍊錶合併的方法如下:

/**

* 合併兩個鍊錶

* @param left

* @param right

* @return

*/private listnode mergetwolist(listnode left, listnode right) else

cur = cur.next;

}// 將剩餘的鍊錶鏈結到結果上,下同。 注意這裡不是while。

if (left != null)

if (right != null)

return dummy.next;

}

有了上面的方法,於是合併k個鍊錶的實現如下:

/**

* 合併k個鍊錶

* @param lists

* @return

*/public listnode mergeklists(listnode lists)

return mergerange(lists, 0, lists.length - 1);

}

由於合併兩個有序鍊錶的時間複雜度是o(n), 而兩兩分組的個數是logk個,故總的時間複雜度是o(nlogk)。

合併K個有序鍊錶

public class 023 mergeklists 堆中結點類 author luzhen work pc private static class node implements comparable override public int compareto node o 將k個有序鍊錶歸...

合併k個有序鍊錶

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

合併K個有序鍊錶O N lgK

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