📅  最后修改于: 2023-12-03 15:25:50.956000             🧑  作者: Mango
给定一个单向链表,找到其中第一个重复出现的元素。
一种简单的思路是使用哈希表,将链表中的元素逐一插入至哈希表中,如果发现某个元素已经存在于哈希表中,则说明这是第一个重复的元素。该算法的时间复杂度为 O(n),因为需要遍历整个链表并插入哈希表。
另一种思路是使用快慢指针,可以在不使用额外空间的情况下解决该问题。具体做法是,使用两个指针,一个指针每次走一步,另一个指针每次走两步。如果存在重复元素,则两个指针最终会相遇。该算法的时间复杂度为 O(n),因为只需要遍历整个链表一次。
以下为使用哈希表的实现代码:
def firstDuplicateNode(head):
hashSet = set()
current = head
while current:
if current.val in hashSet:
return current
else:
hashSet.add(current.val)
current = current.next
return None
以下为使用快慢指针的实现代码:
def firstDuplicateNode(head):
slow, fast = head, head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
if slow == fast:
slow2 = head
while slow2 != slow:
slow = slow.next
slow2 = slow2.next
return slow
return None
以上代码有两个函数,一个是 firstDuplicateNode
,即找到链表中第一个重复的元素;另一个是 ListNode
,即用于表示链表中的一个节点。需要根据实际情况,调整 ListNode
的定义。