/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */
/**
 * 
 * @param pHead1 ListNode类 
 * @param pHead2 ListNode类 
 * @return ListNode类
 */
 int hascommonnode(struct ListNode *phead1,struct ListNode*phead2,int* x1,int *x2)
 {
struct  ListNode *tail1=phead1,*tail2=phead2;
while(tail1->next!=NULL)
{
    tail1=tail1->next;
    (*x1)++;
}
while(tail2->next!=NULL)
{
    tail2=tail2->next;
    (*x2)++;
}
if(tail1==tail2)
{
    return true;
}
else {
return false;
}
 }
struct ListNode* FindFirstCommonNode(struct ListNode* pHead1, struct ListNode* pHead2 ) {
    // write code here
    int x1=0,x2=0;
    if(pHead1==NULL||pHead2==NULL)
    return NULL;
    int  p=hascommonnode(pHead1,pHead2,&x1,&x2);
    if(p==0)
    {
return NULL;
    }
struct ListNode *fastpointer=  x1>x2 ? pHead1:pHead2,*slowpointer;
if(fastpointer==pHead1)
{
    slowpointer=pHead2;
}
else {
slowpointer=pHead1;
}
int num=abs(x1-x2);
while(num>0)
{
fastpointer=fastpointer->next;
    num--;
}
while(fastpointer!=slowpointer)
{
fastpointer=fastpointer->next;
slowpointer=slowpointer->next;
}
return fastpointer;
}