/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */
 //方法一:
 //判断是否有空链表,有则返回空
//接着首先遍历两个链表的节点数n1,n2
//然后比较节点数大小,做差为K
//长链表跑到第k个点
//然后两个链表再同时跑
//判断是否有相同的节点且不为null

//方法二:
//判断是否有空,则输出空
//利用跑环法:即假设链表pHead1长度为L1+C,链表pHead2长度为L2+C,那么双方只要各自跑L1+L2+C的路程,两者就会相遇
//利用while循环判断跑环过程中指针p1和指针p2指向的节点是否相同,
    //它们相同时可能:在链中或为NULL
    
    /**
 * 
 * @param pHead1 ListNode类 
 * @param pHead2 ListNode类 
 * @return ListNode类
 */
struct ListNode* FindFirstCommonNode(struct ListNode* pHead1, struct ListNode* pHead2 ) 
{
    // write code here.

    //方法二
    //判断是否有空,则输出空
    if(pHead1 == NULL || pHead2 == NULL)
    {
        return NULL;
    }
    //利用跑环法:即假设链表pHead1长度为L1+C,链表pHead2长度为L2+C,那么双方只要各自跑L1+L2+C的路程,两者就会相遇
    //先定义两个指针,方便移动
    struct ListNode *p1 = pHead1;
    struct ListNode *p2 = pHead2;

    //利用while循环判断跑环过程中指针p1和指针p2指向的节点是否相同,
        //它们相同时可能:在链中或为NULL
    while(p1!=p2)
    {
        p1 = p1==NULL?pHead2:p1->next;   //三目运算符,p1==NULL条件成立,p1=pHead2, 否则p1=p1->next
        p2 = p2==NULL?pHead1:p2->next; 
    }
    
    return p1;
}