题目:
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
思路:
创建slow和fast两个指针,slow每次走一步,fast每次走两步,若链表中有环slow和fast一定会相遇。那时,slow走的步数=x+P*L+s,fast走的步数=x+Q*L+s,其中x表示从头节点到环入口的节点数,L为环的长度,P和Q是整数,s表示最后相遇这一圈在环中走的步数。那么fast走的步数-slow走的步数=(Q-P)L=slow走的步数,因此它们相遇时slow走的步数是环长度的整数倍,那么x+s=L。把slow重新置到pHead,fast和slow同时走,只不过这时都走一步,那么slow走x步就会与fast相遇与环的入口。
Java
package nowcoder;
/**
* @author LiuZhiguo
* @date 2020/2/13 21:35
*/
public class S55_MeetingNode {
public ListNode meetingNode(ListNode pHead){
if (pHead == null || pHead.next == null)
return null;
ListNode slow = pHead;
ListNode fast = pHead;
while (slow != null && fast != null){
slow = slow.next; //走一步
fast = fast.next.next; //走两步
if (slow == fast)
break;
}
slow = pHead;
while (slow != fast){
slow = slow.next;
fast = fast.next;
}
return slow;
}
}