有意思,记录一下。

双指针,走到头之后从另一条的起点继续走,若公共节点存在,最终将在公共节点相遇。
以上思路不难想到。坑点在于,一开始用的是 当前结点.next 进行判空,提示复杂度超。
随手去掉 .next 后通过了,百思不得姐。看到题解评论恍然大悟,具体原因注在代码中。

public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
    ListNode pA = pHead1, pB = pHead2;
    while(pA != pB){ 
//      此处直接用 pA 和 pB 判空,而非 .next 判空是为了避免死循环(两链表无公共节点)的情况:
//      使用 pA、pB 判空,若无公共节点,则最多走 a + b 步(若 a = b,则只需 a 步。a、b为两链表长度),
//      此时 pA = pB = null,即退出循环返回 null;否则陷入死循环。
        pA = pA == null ? pHead2 : pA.next;
        pB = pB == null ? pHead1 : pB.next;
    }
    return pA;
}