剑指Offer-链表环的入口

题目描述

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

解法:先采用快慢指针,一个走两步,一个走一步,假设走两步的指针先到达尾部,那么就是没有环,假设有环,两个指针必定会相遇,相遇之后,走两步的指针从头节点重新开始,两个指针都走一步,当两个指针再次相遇时,即为环的入口。


public class Solution {

	public ListNode EntryNodeOfLoop(ListNode pHead) {
		ListNode one = pHead;
		ListNode two = pHead;
		while (two.next != null) {
			if (null != two.next.next) {
				//走两步
				two = two.next.next;
				//走一步
				one = one.next;
			} else {
				return null;
			}
			//第一个从相遇后
			if (one == two) {
				//走两步的指针从头结点重新开始
				two = pHead;
				//再次相遇,节点即为环的入口
				while (one != two) {
					one = one.next;
					two = two.next;
				}
				return one;
			}
		}
		return null;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_39290830/article/details/84869264