链表中环的入口结点
问题简述
给一个长度为 n 的链表,若其中包含环,请找出该链表的环的入口结点,否则返回null。思路:快慢指针
快指针
fast每次走两步,慢指针slow每次走一步;若存在环,则
fast与slow必会相遇;相遇后,将
slow重新指向pHead,然后,双指针正常每次走一步;当再次相遇时,即为入口节点;
注意无环的情况;
证明:
假设存在环,记环之前的节点数即为 $a$(不包括入口节点),环的节点数为 $b$;当
fast和slow相遇时距离环入口的步数为 $c$;下面证明:$a=c$
记
fast和slow走的步数分别为 $f$ 和 $s$,且 $f-s = nb$,即fast比slow多走了n圈;又 $f=2s$,可得 $s=nb$,而实际上slow走的距离 $s=a + (n-1)b + (b-c)$,联立得 $a=c$;因此当
fast和slow在环内相遇时,将slow重新指向pHead,然后双指针再次相遇时即为入口节点(每次走一步);
Last updated