📜  找到链表中第一个重复的元素(1)

📅  最后修改于: 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 的定义。