LeetCode 热题 100 之 160. 相交链表

发布时间 2023-07-17 11:05:40作者: anamazingclown

题目描述

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

图示两个链表在节点 c1 开始相交:

image

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构 。

自定义评测:

评测系统 的输入如下(你设计的程序 不适用 此输入):

intersectVal - 相交的起始节点的值。如果不存在相交节点,这一值为 0
listA - 第一个链表
listB - 第二个链表
skipA - 在 listA 中(从头节点开始)跳到交叉节点的节点数
skipB - 在 listB 中(从头节点开始)跳到交叉节点的节点数
评测系统将根据这些输入创建链式数据结构,并将两个头节点 headA 和 headB 传递给你的程序。如果程序能够正确返回相交节点,那么你的解决方案将被 视作正确答案 。

示例 1:

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3
输出:Intersected at '8'
解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。
在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
— 请注意相交节点的值不为 1,因为在链表 A 和链表 B 之中值为 1 的节点 (A 中第二个节点和 B 中第三个节点) 是不同的节点。换句话说,它们在内存中指向两个不同的位置,而链表 A 和链表 B 中值为 8 的节点 (A 中第三个节点,B 中第四个节点) 在内存中指向相同的位置。

提示:

listA 中节点数目为 m
listB 中节点数目为 n
1 <= m, n <= 3 * 104
1 <= Node.val <= 105
0 <= skipA <= m
0 <= skipB <= n
如果 listA 和 listB 没有交点,intersectVal 为 0
如果 listA 和 listB 有交点,intersectVal == listA[skipA] == listB[skipB]

思路

由相交部分后的节点都一样,相交往后链表一样长,因此可以判断链表哪个长,定义两个指针,分别指向两个链表,长的链表线多走长出来的部分,走完后,两个指针同步往后走,每同步走一步,则判断一下两个指针是否指向同一个,若是则返回指针,若不是则一直走到找到或者为空.

代码

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:
        lena = 0
        lenb = 0
        nodea =headA
        nodeb = headB
        while(nodea!=None):
            lena+=1
            nodea= nodea.next
        while(nodeb!=None):
            lenb+=1
            nodeb= nodeb.next
        # print(lena,lenb)
        nodea =headA
        nodeb = headB
        if(lena >lenb):
            temp =lena-lenb
            while(temp):
                nodea =nodea.next
                temp-=1
           
        else:
            temp =lenb-lena
            while(temp):
                nodeb =nodeb.next
                temp-=1



        while(nodea!=None):
            if(nodea==nodeb):
                return nodea
            else:
                nodea = nodea.next
                nodeb = nodeb.next
        return None