/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
*
* @param pHead1 ListNode类
* @param pHead2 ListNode类
* @return ListNode类
*/
struct ListNode* FindFirstCommonNode(struct ListNode* pHead1,
struct ListNode* pHead2 ) {
// write code here
struct ListNode* p1 = pHead1;
struct ListNode* p2 = pHead2;
if (pHead1 == NULL || pHead2 == NULL) {
return NULL;
}
// 先遍历两条链表,算出各链表的长度,然后再根据两者长度的差值,先后开始遍历两个链表,两链表遍历的相遇点就是目标节点
int LenP1 = 0;
int LenP2 = 0;
int m = 0;
while (p1) {
p1 = p1->next;
LenP1++;
}
while (p2) {
p2 = p2->next;
LenP2++;
}
m = LenP1 - LenP2;
if (m > 0) {
while (pHead1) {
if (pHead1 == pHead2) {
return pHead1;
}
pHead1 = pHead1->next;
if (m <= 0) {
pHead2 = pHead2->next;
}
m--;
}
} else {
while (pHead2) {
if (pHead1 == pHead2) {
return pHead2;
}
pHead2 = pHead2->next;
if (m >= 0) {
pHead1 = pHead1->next;
}
m++;
}
}
return NULL;
}