劍指offer之連結串列中環的入口(Java實現)
阿新 • • 發佈:2018-12-26
連結串列中環的入口
題目描述:
給一個連結串列,若其中包含環,請找出該連結串列的環的入口結點,否則,輸出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;
}
}