/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
        // 利用set保存数据的唯一性判断重复位置,插入失败时即指向第一个重复元素
        set<ListNode*> visited;

        ListNode* p1 = pHead1;
        ListNode* p2 = pHead2;
        while(p1 != nullptr || p2 != nullptr){
            if(p1 != nullptr){
                if(visited.insert(p1).second){
                    // p1插入成功
                    p1 = p1->next;
                }
                else{
                    // p1插入失败,说明集合中有相同元素
                    return p1;
                }
            }

            if(p2 != nullptr){
                if(visited.insert(p2).second){
                    // p2插入成功
                    p2 = p2->next;
                }
                else{
                    // p2插入失败,说明集合中有相同元素
                    return p2;
                }
            }
        }
        return nullptr;
    }
};