返回

剑指 Offer 52 题:寻找两个链表的第一个公共节点

后端

剑指 Offer 52 题:两个链表的第一个公共节点

在剑指 Offer 52 题中,您需要找到两个链表的第一个公共节点。所谓公共节点,是指两个链表中同时存在的同一个节点。对于这个问题,我们可以采用以下步骤来解决:

  1. 确定两个链表的长度: 首先,我们需要知道两个链表的长度,以便进行下一步的计算。我们可以通过遍历每个链表,并计算链表中节点的数量来确定长度。

  2. 将较长链表的指针移动到与较短链表相同的位置: 如果两个链表的长度不同,我们需要将较长链表的指针移动到与较短链表相同的位置。这可以通过将较长链表的指针移动较长链表长度减去较短链表长度的步数来实现。

  3. 同时遍历两个链表并比较节点: 现在,我们可以同时遍历两个链表并比较每个节点。如果两个节点相等,则说明这就是第一个公共节点。如果两个节点不相等,则继续遍历。

  4. 继续比较节点,直到找到第一个公共节点: 继续比较两个链表的节点,直到找到第一个公共节点。

  5. 返回第一个公共节点: 一旦找到第一个公共节点,就可以将其返回作为答案。

代码示例

def find_first_common_node(head1, head2):
    """
    找到两个链表的第一个公共节点。

    参数:
        head1 (ListNode): 第一个链表的头结点。
        head2 (ListNode): 第二个链表的头结点。

    返回:
        ListNode: 第一个公共节点。
    """

    # 计算两个链表的长度
    len1 = get_length(head1)
    len2 = get_length(head2)

    # 将较长链表的指针移动到与较短链表相同的位置
    if len1 > len2:
        for i in range(len1 - len2):
            head1 = head1.next

    elif len2 > len1:
        for i in range(len2 - len1):
            head2 = head2.next

    # 同时遍历两个链表并比较节点
    while head1 and head2:
        if head1 == head2:
            return head1
        head1 = head1.next
        head2 = head2.next

    # 返回第一个公共节点
    return None

def get_length(head):
    """
    获取链表的长度。

    参数:
        head (ListNode): 链表的头结点。

    返回:
        int: 链表的长度。
    """

    length = 0
    while head:
        length += 1
        head = head.next

    return length

结语

希望这篇文章对您有所帮助。如果您还有其他问题,请随时提出。祝您学习愉快!