假设有一个带有n个节点的循环单链表。给定指向头部的指针,如何在O(n)时间和O(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)这是一个测试你对时间复杂性理解的技巧问题。在这种情况下,答案是不可能的。
后者更有可能。