我有以下解决方案,但我从其他评论者那里得知,它是O(N * K * K)
,而不是O(N * K)
,其中N
是{{1}的(最大)长度}列表,而K
是列表数。例如,给定列表K
和[1, 2, 3]
,[4, 5]
为3,而N
为2。
K
我的推理是,/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
private void advance(final ListNode[] listNodes, final int index) {
listNodes[index] = listNodes[index].next;
}
public ListNode mergeKLists(final ListNode[] listNodes) {
ListNode sortedListHead = null;
ListNode sortedListNode = null;
int associatedIndex;
do {
int minValue = Integer.MAX_VALUE;
associatedIndex = -1;
for (int listIndex = 0; listIndex < listNodes.length; listIndex++) {
final ListNode listNode = listNodes[listIndex];
if (listNode != null && listNode.val < minValue) {
minValue = listNode.val;
associatedIndex = listIndex;
}
}
if (associatedIndex != -1) {
if (sortedListNode == null) {
sortedListNode = new ListNode(minValue);
sortedListHead = sortedListNode;
}
else {
sortedListNode.next = new ListNode(minValue);
sortedListNode = sortedListNode.next;
}
advance(listNodes, associatedIndex);
}
}
while (associatedIndex != -1);
return sortedListHead;
}
}
循环的主体将发生do-while
次(因为迭代了最长的列表时,N
循环的停止条件已满足),而do-while
循环的do-while
循环的主体将发生for
次(K
),产生listNodes.length
。
为什么上述解决方案O(n * k)
代替了?
答案 0 :(得分:2)
您的结果列表最多包含 n * k 个项目。将这些项目的每一个相加会花费O( k )(内部循环执行 k 迭代以检查每个列表的头部)。因此,总运行时间为O( n * k * k )。