📜  两个链表的交点 |设置 3(1)

📅  最后修改于: 2023-12-03 15:06:14.695000             🧑  作者: Mango

两个链表的交点 |设置 3

当两个链表存在交点时,找出它们的交点。

我们可以通过遍历两个链表的方式来找到它们的交点。具体的思路可以分为以下几步:

  1. 分别遍历两个链表,得到它们的长度 $l_1$ 和 $l_2$;
  2. 将较长的链表从头开始,向后遍历 $|l_1-l_2|$ 步,使得两个链表的长度相等;
  3. 同时遍历两个链表,直到找到它们的交点或者到达链表的尾部。

代码实现如下:

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

def getIntersectionNode(headA: ListNode, headB: ListNode) -> ListNode:
    len_a, len_b = 0, 0
    node_a, node_b = headA, headB

    # 获取链表的长度
    while node_a:
        len_a += 1
        node_a = node_a.next
    while node_b:
        len_b += 1
        node_b = node_b.next

    # 将较长的链表向后移动
    if len_a > len_b:
        for i in range(len_a - len_b):
            headA = headA.next
    else:
        for i in range(len_b - len_a):
            headB = headB.next

    # 同时遍历两个链表,找到交点
    while headA and headB:
        if headA == headB:
            return headA
        headA = headA.next
        headB = headB.next

    return None

上述代码的时间复杂度为 $O(l_1 + l_2)$,其中 $l_1$ 和 $l_2$ 分别为两个链表的长度。空间复杂度为 $O(1)$。