У меня есть следующее решение, но я слышал от других рецензентов, что это O(N * K * K)
, а не O(N * K)
, где N
- это (максимальная) длина списков K
, а K
- этоколичество списков.Например, учитывая списки [1, 2, 3]
и [4, 5]
, N
равно 3, а K
равно 2.
/**
* 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
выполняется, когда самый длинный список был повторен), в то время как тело for
цикла do-while
цикла будет происходить K
раз (listNodes.length
), давая O(n * k)
.
Почему вышеприведенное решение O(n * k * k)
взамен?