class Solution {
  public:
    ListNode* FindFirstCommonNode(ListNode* pHead1, ListNode* pHead2) {
        ListNode* l1 = pHead1;
        ListNode* l2 = pHead2;
        while (l1 != l2) {
            if (l1 == nullptr)
                l1 = pHead2;
            else
                l1 = l1->next;
            if (l2 == nullptr)
                l2 = pHead1;
            else
                l2 = l2->next;
        }
        return l1;
    }
};
原理背下来就好:
跑两次链表,head1跑到头就跑head2(反之亦然),然后判断在哪里相交。
如果相交的地方是链表末尾(nullptr),那么就没有相交,反之就相交。

当然,慢慢优化一下逻辑可以把代码写的很短,就像上面一样。