[劍指offer] 連結串列中環的入口結點
阿新 • • 發佈:2019-02-02
本文首發於我的個人部落格:尾尾部落
題目描述
給一個連結串列,若其中包含環,請找出該連結串列的環的入口結點,否則,輸出null。
解題思路
第一步,用兩個快慢指標找環中相匯點。分別用slow
, fast
指向連結串列頭部,slow
每次走一步,fast
每次走二步,直到fast == slow
找到在環中的相匯點。
第二步,找環的入口。當fast == slow
時,假設slow
走過x個節點,則fast
走過2x個節點。設環中有n個節點,因為fast
比slow
多走一圈(n個節點),所以有等式2x = n + x
,可以推出n = x
,即slow
實際上走了一個環的步數。這時,我們讓fast
pHead
,slow
的位置不變,然後slow
和fast
一起向前每次走一步,直到fast == slow
,此時兩個指標相遇的節點就是環的入口。
參考程式碼
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead)
{
if (pHead.next == null || pHead.next.next == null)
return null;
ListNode slow = pHead.next;
ListNode fast = pHead.next.next;
while(fast != null){
if(fast == slow){
fast = pHead;
while(fast != slow){
fast = fast.next;
slow = slow.next;
}
return fast;
}
slow = slow.next;
fast = fast.next.next;
}
return null;
}
}