/**
* 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;
}