将链表拆分为2个包含最小和最大数字的偶数列表

时间:2011-02-09 12:25:13

标签: java algorithm data-structures

给定一个按随机顺序排列的整数链表,将其拆分为两个新的链表,这样每个列表的元素总和之差最大,列表长度相差不超过1(在这种情况下)原始列表具有奇数个元素)。 我不能假设列表中的数字是唯一的。

我想到的算法是在原始链表( O(n·log n)时间, O(n)空间)上进行合并排序,然后使用递归函数走到列表的末尾以确定其长度,在递归函数展开时进行拆分。递归函数是 O(n)时间和 O(n)空间。

这是最佳解决方案吗?如果有人认为它是相关的,我可以发布我的代码。

2 个答案:

答案 0 :(得分:4)

不,它不是最佳的;你可以找到median of a list in O(n),然后把它们中的一半放在一个列表中(小于中位数或相等,最多列表大小为n / 2),其中一半放在另一个列表中((n + 1)/ 2)。它们的总和差异最大化,并且不需要排序( O(n·log(n))。所有事情都将在 O(n)(空间)中完成和时间)。

答案 1 :(得分:1)

为什么需要递归函数?排序列表时,您可以计算它的元素。然后把它分成两半。这会降低O(n)空间要求。

即使您在排序时无法计算列表长度,它仍然可以在O(n)时间和O(1)空间中分割:在开头获取两个列表迭代器,在每一步前进2个元素,第二个每一步有1个元素。当第一个到达列表结束时 - 在第二个时候切换。