如何使用O(n)时间和O(1)空间删除单链表上的重复元素?
元素可以是任何字符,数字,也不会被排序。
例如,给定8 - > 6 - > 7 - > 6 - > 5
返回8 - > 6 - > 7 - > 5
O(1)空间似乎很难?
答案 0 :(得分:0)
你不能因为你无法在复杂度小于O(logn)的列表中搜索....我们必须在删除isnt之前搜索重复项?然后对于每个元素你必须做同样的事情,因此它将是O(nlogn)。这个列表有任何专长,然后可以使用替代逻辑。指定是否有?
答案 1 :(得分:0)
有几种不同的方法可以做到这一点:
遍历链表并构建一个Hash表,用于存储数据及其频率。当您遍历时,如果您遇到频率值> 1,您可以从列表中删除相应的节点。由于使用了哈希表,这将给O(n)时间但是O(n)空间。
降低解决方案1中O(n)空间复杂度的一种方法是:如果您知道输入元素的范围,则可以使用固定大小的数组而不是哈希表。这将使其成为O(n)时间和O(1)空间。
这是通过反复遍历链表但在没有使用任何额外内存的情况下用o(n2)组成的时间,可以实现。
由于假设输入数组没有排序,所以没有额外的内存就无法做到这一点。