返回

相交链表:精妙技巧,轻松搞定!

前端

各位算法爱好者,大家好!今天,我们一起来征服 LeetCode 上著名的 42 号问题——相交链表。凭借巧妙的技巧和清晰的思路,我们将轻而易举地找到链表相交的起始节点。准备好了吗?那就让我们开始吧!

算法讲解

相交链表问题看似复杂,但它的解决方法却非常巧妙。我们只需将两个链表连接成一个闭环,然后通过快慢指针的方法寻找相交点即可。具体步骤如下:

  1. 连接链表: 将两个链表的尾节点相连,形成一个闭环。这样,我们就确保了两个链表必定会相交。
  2. 设置快慢指针: 定义两个指针,分别称为快指针和慢指针。快指针一次走两步,而慢指针一次走一步。
  3. 寻找相交点: 让快慢指针同时从链表头开始前进。由于快指针走得更快,它最终会追上慢指针。当快慢指针相遇时,就说明链表相交了。
  4. 计算环的长度: 从相交点出发,继续让快指针前进。当它再次与慢指针相遇时,就表明环的长度为两倍的相交点到环起始点的距离。
  5. 找到相交点: 再次从链表头出发,让两个指针都以正常速度前进。当它们前进的距离等于环的长度时,它们将同时到达相交点。

代码示例

def get_intersection_node(headA, headB):
    """
    返回两个单链表相交的起始节点

    参数:
        headA (ListNode): 第一个链表的头节点
        headB (ListNode): 第二个链表的头节点

    返回:
        ListNode: 相交的起始节点
    """

    # 检查链表是否为空
    if not headA or not headB:
        return None

    # 连接链表
    tailA = headA
    while tailA.next:
        tailA = tailA.next
    tailA.next = headB

    # 设置快慢指针
    slow = headA
    fast = headA

    # 寻找相交点
    while fast and fast.next:
        slow = slow.next
        fast = fast.next.next
        if slow == fast:
            break

    # 相交链表的起始点不存在
    if not fast or not fast.next:
        return None

    # 计算环的长度
    cnt = 1
    fast = fast.next
    while fast != slow:
        fast = fast.next
        cnt += 1

    # 找到相交点
    slow = headA
    fast = headB
    for _ in range(cnt):
        fast = fast.next
    while slow != fast:
        slow = slow.next
        fast = fast.next

    # 断开链表
    tailA.next = None

    return slow

总结

相交链表问题是一道经典的算法题目,但通过巧妙的技巧,我们可以轻松解决它。只要我们理解了算法的原理,并将其转化为清晰的代码,任何人都可以征服这道难题。如果您对算法感兴趣,欢迎继续阅读我接下来的文章,我们将一起探索更多算法的奥秘!