/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
        ListNode* cur1 = pHead1;
        ListNode* cur2 = pHead2;

        // 双指针,当 cur1等于 cur2时返回公共的节点,退出循环。或者 cur1和 cur2同时为 nullptr即没有公共节点时退出 while循环
        while(cur1 || cur2) {
            if(cur1 == cur2) {
                return cur1;
            }
            // cur1和 cur2同时遍历,注意当其中一个指针为空时跳转到另一个链表,而不是另一个链表上的指针(cur1或cur2)
            cur1 = cur1==nullptr ? pHead2 : cur1->next;
            cur2 = cur2==nullptr ? pHead1 : cur2->next;
        }

        // 如果cur1、cur2同时为空时即没有公共的节点返回 nullptr
        return nullptr;
    }
};