/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
* @author Senky
* @date 2023.04.19
* @par url https://www.nowcoder.com/creation/manager/content/584337070?type=column&status=-1
* @param pHead1 ListNode类
* @param pHead2 ListNode类
* @return ListNode类
*/
struct ListNode* FindFirstCommonNode(struct ListNode* pHead1, struct ListNode* pHead2 ) {
// write code here
/*头尾相等直接返回*/
if(pHead1 == pHead2) return pHead1;
struct ListNode* p1 = pHead1;
struct ListNode* p2 = pHead2;
struct ListNode* result = NULL;
int len1 = 0;
int len2 = 0;
/*计算两个链表大小*/
while(p1 != p2)
{
if(p1)
{
p1 = p1->next;
len1++;
}
if(p2)
{
p2 = p2->next;
len2++;
}
}
/*记录两个链表的长度差*/
int n = (len1 >= len2)?(len1-len2):(len2 - len1);
p1 = pHead1;
p2 = pHead2;
/*将两个链表对齐*/
for(int i =0 ; i < n; i++)
{
if( (len1 > len2) && p1) p1 = p1->next;
else if( (len1 < len2) && p2) p2 = p2->next;
}
/*同时移动直到相等*/
while(p1 != p2)
{
p1 = p1->next;
p2 = p2->next;
}
result = p1;
return result;
}
图解:
