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

图解: