剣はオファー23を指します。リンクリスト内のリングのエントリノード
タイトル説明
問題解決のアイデア
リング文言があるかどうか、次の誤った判断に注意してください。
while (fast != null && fast.next != null && fast != slow) {
fast = fast.next.next;
slow = slow.next;
}
if (fast != slow) return null;
注:リンクリストにノードが1つしかなく、それがリングを形成しない場合、この記述は間違っています。したがって、リングがあるかどうかを判断するときに、次のように変更できます。if (fast != null && fast.next != null) return null;
ただし、フラグビットを設定して明確にすることができます。
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead) {
if(pHead == null) return null;
ListNode fast = pHead, slow = pHead; //快慢指针
boolean hasCycle = false; //标志是否有环
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
if (fast == slow) {
hasCycle = true;
break;
}
}
//没有环则直接返回null
if (!hasCycle) return null;
//如果有环,则令fast从头开始,并和slow同步移动,直到相遇,则为环的入口节点
fast = pHead;
while (fast != slow) {
slow = slow.next;
fast = fast.next;
}
return fast;
}
}