题目
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
图示两个链表在节点 c1 开始相交:
题目数据保证整个链式结构中不存在环。
注意,函数返回结果后,链表必须保持其原始结构。
方法
要注意的是,此处的相交并不单单代表节点值相等,即并非节点值相等处就为链表相交的节点。而是只有两个链表的相交节点及其后面节点均相同(currA == currB),才可确定此节点为链表相交的起始节点。
分别以不同的顺序走两个链表 A 和 B ,顺序 1 为先走链表 A 后走链表 B,顺序 2 为先走链表 B 后走链表 A 。即使是以不同的顺序通过两个链表,但因为两个顺序所通过的总节点数量是相同的,若同时从头节点出发,那么将会同时到达第二个链表的尾节点。
所以,我们可以得知,若两个链表存在相交,那么他们将会在走第二个链表时同时到达相交节点。若两个链表不存在相交,那么他们将会在走第二个链表时同时到达 Null 。
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def getIntersectionNode(self, headA, headB):
currA = headA
currB = headB
while currA != currB:
if currA:
currA = currA.next
else:
currA = headB
if currB:
currB = currB.next
else:
currB = headA
return currA