返回

漫谈「02.07. 链表相交」:抽丝剥茧,交点初现

前端

在算法面试中,链表相交是一个常见的考察点,考察的重点是如何有效地找到两个链表的交点。对于这项任务,我们提供了这篇文章,带你领略如何抽丝剥茧,找寻交点,掌握链表相交的奥秘。

在本文中,我们将从三个方面来探讨:

  • 如何判断两个链表是否相交
  • 如果相交,如何找到交点
  • 代码实现和示例

一、判断链表是否相交

首先,我们需要确定两个链表是否相交。最简单的方法是使用两个指针,一个指向链表A的头部,另一个指向链表B的头部。然后,分别遍历两个链表,如果在遍历过程中遇到相同的节点,则说明两个链表相交。

二、找到链表相交的交点

如果两个链表相交,我们需要找到它们的交点。我们可以使用以下步骤来实现:

  1. 找到两个链表的长度。
  2. 将较长的链表向后移动,使其与较短的链表长度相同。
  3. 然后,从两个链表的头部同时向前移动,直到遇到相同的节点,这个节点就是交点。

三、代码实现和示例

def get_intersection_node(headA, headB):
    """
    :type head1, head1: ListNode
    :rtype: ListNode
    """
    # 计算两个链表的长度
    lenA = get_length(headA)
    lenB = get_length(headB)

    # 将较长的链表向后移动,使其与较短的链表长度相同
    if lenA > lenB:
        for i in range(lenA - lenB):
            headA = headA.next
    elif lenB > lenA:
        for i in range(lenB - lenA):
            headB = headB.next

    # 从两个链表的头部同时向前移动,直到遇到相同的节点
    while headA != headB:
        headA = headA.next
        headB = headB.next

    # 返回交点
    return headA


def get_length(head):
    """
    :type head: ListNode
    :rtype: int
    """
    length = 0
    while head:
        length += 1
        head = head.next
    return length

示例:

# 创建两个链表
headA = ListNode(1)
headA.next = ListNode(2)
headA.next.next = ListNode(3)

headB = ListNode(4)
headB.next = ListNode(5)
headB.next.next = ListNode(6)
headB.next.next.next = headA.next.next

# 找到交点
intersection = get_intersection_node(headA, headB)

# 打印交点
print(intersection.val)  # 输出:3

结语

链表相交是一个经典的算法面试题,通过理解链表相交的实质和掌握检测链表相交的技巧,可以帮助你在面试中脱颖而出。