/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:

	// 对于输入  {1,2,3,4,5},{},{6,7,8}
	// 这个意思 指pHead2 从6开始
	// 所以 我的写法是不行的
    ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {

		// if(pHead1 == nullptr && pHead2!=nullptr)
		// {
		// 	if(pHead1->next !=nullptr) return pHead1->next;
			
		// 	// return pHead2;
		// }

		// if(pHead2 == nullptr && pHead1!=nullptr)
		// {
		// 	if(pHead2->next !=nullptr) return pHead2->next;
		// }
		if(pHead1==nullptr || pHead2==nullptr)
		{
			return nullptr;
		}
		// 先判断 是否其中一个是另一个的子链 若是 就直接返回此结点
		ListNode* cur = pHead1;
		while(cur != nullptr)
		{
			if(cur == pHead2) return cur;
			cur = cur->next;
		}

		cur = pHead2;
		while(cur != nullptr)
		{
			if(cur == pHead1) return cur;
			cur = cur->next;
		}

		// 此外 就两指针 遍历  分3种情况
		if(pHead1 == pHead2)
		{
			return pHead1;
		}
		ListNode* cur1 = pHead1;
		ListNode* cur2 = pHead2;

		while(cur1!=nullptr && cur2!=nullptr)
		{
			if(cur1->next == cur2)
			{
				return cur2;
			}
			else if(cur2->next == cur1)
			{
				return cur1;
			}
			else if(cur1->next == cur2->next ) // && cur1->next!=nullptr  包含了 最后都指向空
			{
				return cur1->next;
			}

			if(cur1->next != nullptr) cur1 = cur1->next;
			
			if(cur2->next != nullptr) cur2 = cur2->next;
		}

		return nullptr;
        
    }

	// // 想明白了得通过 反转链表 从后往前 直到第一个 指针不同时 的位置就是 公共节点

	// ListNode* reverse(ListNode* head)
	// {
	// 	if(head == nullptr) return nullptr;

	// 	ListNode* cur = head;
	// 	ListNode* pre = nullptr;

	// 	while(cur != nullptr)
	// 	{
	// 		ListNode* tmp = cur->next;

	// 		cur->next = pre;

	// 		pre = cur;
	// 		cur = tmp;
	// 	}

	// 	return pre;
	// }

	// ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {

	// 	if(pHead1==nullptr || pHead2==nullptr)
	// 	{
	// 		return nullptr;
	// 	}

	// 	// 反转链表

	// 	ListNode* inv1 = reverse(pHead1); // 也不行  因为 翻转第一个之后 蒂2个的反转就不是那个效果了
	// 	ListNode* inv2 = reverse(pHead2);

	// 	ListNode* cur1 = inv1, *cur2 = inv2;

	// 	// if(cur1 != cur2 ) return nullptr;



	// 	while(cur1->next!=cur2->next)
	// 	{
	// 		cur1 = cur1->next;
	// 		cur2 = cur2->next;

	// 	}

	// 	// 再把 原第一个  转回来
	// 	reverse(inv1);
	// 	return cur1;

	// }

};

O(n) O(1)

虽然是简单题 但 通过率并不高