题目
题号:55
题目名:链表中环的入口结点
编程语言
Java
题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
初次思路
运用快慢指针
标记是否有环
有环的题,很多都可以用快慢指针来解决,为了方便处理,可以加上一个虚拟头结点
解题代码
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead) {
if (pHead == null || pHead.next == null) return null;
ListNode dummy = new ListNode(0);//虚拟头结点
boolean hasCircle = false;//标机是否有环
dummy.next = pHead;
ListNode slow = dummy.next;//慢指针
ListNode quick = pHead.next;//快指针
//如果有环,快指针能超圈慢指针
while (quick != null && quick.next != null) {
slow = slow.next;
quick = quick.next.next;
if (quick == slow) {
hasCircle = true;
break;
}
}
//如果有环,要慢指针从头出发,会与已经和快指针相遇的慢指针在环入口处相交,可以画图尝试一下
if (hasCircle) {
ListNode curr = dummy;
while (curr != slow) {
curr = curr.next;
slow = slow.next;
}
return curr;
} else return null;
}
}
算法练习代码我都开源在码云上,有需要的朋友可以看看