双指针法

双指针,分别指向链表1和链表2的表头,同时往后移动,若链表1到达末尾,则跳到链表2的表头继续进行(链表2同理)。当指针相同时,即为共用链表段的开端(数学原理)。 alt

# def __init__(self, x):
#     self.val = x
#     self.next = None
# 
# @param pHead1 ListNode类 
# @param pHead2 ListNode类 
# @return ListNode类
#
class Solution:
    def FindFirstCommonNode(self , pHead1 , pHead2 ):
        if pHead1 == None or pHead2 == None: return None
        # 记录表头
        p1,p2 = pHead1,pHead2
        time = 0
        while pHead1 != pHead2:
            # 最多只遍历一轮,防止没有公共节点时,出现无限循环
            if time == 2:
                return None
            # 若链表1遍历完,跳到链表2
            if pHead1.next:
                pHead1 = pHead1.next
            else:
                pHead1 = p2
            # 若链表2遍历完,跳到链表1
            if pHead2.next:
                pHead2 = pHead2.next
            else:
                pHead2 = p1
                time += 1
        return pHead1