给出一个排序的链表,删除所有具有重复编号的节点,只保留原始列表中不同的编号。
示例1:
Input: 1->2->3->3->4->4->5
Output: 1->2->5
示例2:
Input: 1->1->1->2->3
Output: 2->3
在大多数情况下,我已经尝试并成功完成了我的代码,唯一缺少的情况是列表以重复结尾,并且整个过程中都没有重复。
class Solution:
def deleteDuplicates(self, head: ListNode) -> ListNode:
first = head
if first is None:
return []
second = head.next
if second is None:
return first
first.next = second
if first.val == first.next.val:
while first.val == first.next.val:
if first.next.next is None:
return []
first = first.next
return self.deleteDuplicates(first.next)
else:
first.next = self.deleteDuplicates(first.next)
return first
对于[1,2,3,4,4],我得到的错误是“ AttributeError:'list'对象没有属性'val'”。
答案 0 :(得分:0)
您可以在$ O(n)$时间和$ O(n)$空间(最坏的情况)下进行此操作,只需跟踪您到目前为止所看到的内容即可,前提是您的数据是可哈希的。
from collections import defaultdict
def mark_duplicates(current_node, seen_so_far):
next = current_node.next
seen_so_far[current_node.data] += 1
if next is None: return seen_so_far
return mark_duplicates(next, seen_so_far)
def remove_duplicates(current_node, seen):
next = current_node.next
prev = current_node.prev
if seen[current_node.data] > 1:
if prev is not None: prev.next = next
if next is not None: next.prev = prev
# No need to delete current_node, the GC will do it
if next is not None: remove_duplicates(next, seen)
notes = mark_duplicates(head_of_list, defaultdict(int))
remove_duplicates(head_of_list, notes)
defaultdict(int)
只是一个字典,当您尝试访问不存在的键时将返回0。因此,此操作计算每个值出现多少次,然后删除所有显示多次的内容。
答案 1 :(得分:0)
代码工作正常,我只需要将return []更改为简单的“ return”,因为[]未被识别为空链表,而是一个空列表。感谢Devesh Kumar Singh识别此错误,但他没有将其发布为答案,因此我代表他进行了发布。