題幹:合併 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 取出堆中的最小值 也是陣列的第乙個值 然後把該最小值所處的鍊錶的下乙...