1. 程式人生 > >劍指offer之連結串列中環的入口(Java實現)

劍指offer之連結串列中環的入口(Java實現)

連結串列中環的入口

NowCoder

題目描述:

給一個連結串列,若其中包含環,請找出該連結串列的環的入口結點,否則,輸出null。

###解題思路:

第一步,找環中相匯點。分別用p1,p2指向連結串列頭部,p1每次走一步,p2每次走二步,直到p1==p2找到在環中的相匯點。
第二步,找環的入口。接上步,當p1==p2時,p2所經過節點數為2x,p1所經過節點數為x,設環中有n個節點,p2比p1多走一圈有2x=n+x;
n=x;可以看出p1實際走了一個環的步數,再讓p2指向連結串列頭部,p1位置不變,p1,p2每次走一步直到p1==p2;
此時p1指向環的入口。
public class Solution{
    ListNode EntryNodeOfLoop(ListNode pHead){
        if (pHead == null || pHead.next == null)
            return null;
        ListNode p1 = pHead;
        ListNode p2 = pHead;
        while (p2 != null && p2.next != null){
            p1 = p1.next;
            p2 =
p2.next.next; if (p1 == p2){ p2 = pHead; while (p1 != p2){ p1 = p1.next; p2 = p2.next; } if (p1 == p2) return p1; } } return null; }
}