在O(n)时间和O(1)空间中从循环链接列表中删除重复项

时间:2018-04-04 23:22:36

标签: algorithm data-structures time-complexity

假设有一个带有n个节点的循环单链表。给定指向头部的指针,如何在O(n)时间和O(1)空间中删除包含重复数据的节点?面试官特别要求不使用哈希表,只使用指针。

1 个答案:

答案 0 :(得分:0)

从圆形链表中删除重复项的紧固方法是O(n log(n))。这是通过对它们进行排序,然后使用以下算法删除重复项。我们知道任何重复项现在彼此相邻,这就是我们遍历时删除的原因,因此我们只移动了n次。

removeDuplicatesOf(node, head)
    if(node == node.next || node.next == head)
        return
    else if(node.value == node.next.value)
        node.next = node.next.next
        removeDuplicatesOf(node, head)
    else
        removeDuplicatesOf(node.next, head)

在最坏的情况下运行在O(n)中,删除排序列表中的所有重复项。由于这两个参数是单一的,因此空间复杂度为O(1)。这里的问题是你需要对数据进行排序。

由于您只能使用指针,因此想象节点本身是指针,node.next是指向下一个节点的指针。 node.value是节点位置的存储值。我更喜欢对象符号,因为它更易读。

所有其他方法将导致相等或更高的时间复杂度。提出的想法存在的问题是,没有回头看它就无法比较数据。这个额外的步骤使其不可能具有低于O(n log(n))的复杂度。唯一的例外是如果您的列表是预分类的。

如果在面试中这是一个问题,则可能适用两种选择之一:

1)雇主需要一位能够更好地理解时间复杂性的新面试官。

2)这是一个测试你对时间复杂性理解的技巧问题。在这种情况下,答案是不可能的。

后者更有可能。