/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
//思路:
//判断是否有空链表,有则返回空
//接着首先遍历两个链表的节点数n1,n2
//然后比较节点数大小,做差为K
//长链表跑到第k个点
//然后两个链表再同时跑
//判断是否有相同的节点且不为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;
}
//接着首先遍历两个链表的节点数n1,n2
struct ListNode *p1 = pHead1;
struct ListNode *p2 = pHead2;
int len1 = 0, len2 = 0;
while (p1 != NULL )
{
++len1;
p1 = p1->next;
}
while(p2 != NULL)
{
++len2;
p2 = p2->next;
}
//然后比较节点数大小,做差为k
struct ListNode *lList, *sList;
int k;
if(len1>len2)
{
lList = pHead1;
sList = pHead2;
k = len1 - len2;
}
if(len1>len2)
{
lList = pHead1;
sList = pHead2;
k = len1 - len2;
}
else
{
lList = pHead2;
sList = pHead1;
k = len2 - len1;
}
//长链表跑到第k个点
while(k--) //先判断k,然后k再自减 int k=1; while(k- -); printf(“%d”,k); 结果为-1
{
lList = lList->next;
}
//然后两个链表再同时跑
//判断是否有相同的节点且不为null
while(lList != NULL)
{
if(lList == sList) //如果找到相同节点,则立即返回
{
return lList;
}
else
{
lList = lList->next;
sList = sList->next;
}
}
//没有找到相同节点
return NULL;
}