输入两个链表,找出它们的第一个公共结点。

 

一般的思路是找出两个链表 长度的差值,然后长的先跑完差值,最后和着短的链表一起跑,这样必然能够来到第一个公共结点

但是这里有个问题,就是不能够保证这个链表是无环的,如果有环的话,在判断链表长度差值的时候,因为一直不能得到null,所以会陷入死循环。

所以可以先判断是否有环,这个的判断可以通过两种方式,第一种是hashmap或者hashset 的方式,遍历两个链表

第二个就是快慢指针,快的一次两步,慢的一次一步,如果发现空,返回null,如果发现有快慢指针相等的情况(注:必然会相等的,这是结论),则返回这个节点。

在返回这个节点后,又有两种情况:第一种是公共节点在链表上,入环节点在环上;一种是公共节点和入环节点都在环上;公共节点和入环节点不可能都在同一个位置(好好想想就知道了,提示:二叉树的结构)

这个3可以直接让一个节点一直next,如果能够到下一个节点就ok