合并K个排序的链表,为什么复杂度为O(N * K * K),而不是O(N * K)

时间:2018-11-24 02:08:31

标签: algorithm merge linked-list time-complexity big-o

我有以下解决方案,但我从其他评论者那里得知,它是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)代替了?

1 个答案:

答案 0 :(得分:2)

您的结果列表最多包含 n * k 个项目。将这些项目的每一个相加会花费O( k )(内部循环执行 k 迭代以检查每个列表的头部)。因此,总运行时间为O( n * k * k )。