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

#
# 
# @param pHead1 ListNode类 
# @param pHead2 ListNode类 
# @return ListNode类
#
class Solution:
    def FindFirstCommonNode1(self , pHead1 , pHead2 ):
        # write code here
        # 解法1 :  哈希表存储  空间复杂度O(n)    不符合和题目要求
        arr=set()
        cur =pHead1
        while cur:
            arr.add(cur)
            cur=cur.next
        cur2=pHead2
        while cur2:
            if cur2 in arr:
                return cur2
            cur2=cur2.next
        return None
    """
     解法2 : 
     1. 分别得到两个链表长度m,n 。
     2. 求m,n 的长度差值 k ,较长的链表先走k 步。
     3. 然后两个指针分别指向两个链表头结点,同时遍历,遇到第一个相同的节点就是第一个公共节点。
     题目中案例 
     m=5  n =4  k=1 
     第一个链表先走k=1 ,然后两个链表同时
    """
    def FindFirstCommonNode(self , pHead1 , pHead2 ):
        #判空处理
        if not pHead1 or not pHead2:
            return None
        cur1=pHead1
        cur2=pHead2
        m =0
        n=0 
        while cur1:
            m+=1
            cur1=cur1.next
        while cur2:
            n+=1
            cur2=cur2.next
        cur1=pHead1
        cur2=pHead2    
        if m>n:
            k=m-n 
            for i in   range(k):
                cur1=cur1.next
        else:
            k=n-m
            for i in range(k):
                cur2=cur2.next
        while cur1 and cur2:
            if cur1==cur2:
                return cur1
            cur1=cur1.next
            cur2=cur2.next
        return None