給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。
解題思路:
解決這個問題可以分三步。
(1)第一步是確定乙個鍊錶中是否包含環。我們可以用兩個指標來解決這個問題。定義兩個指標,同時從鍊錶的頭結點出發,乙個指標一次走一步,另乙個指標一次走兩步。如果走得快的指標追上了走得慢的指標,那麼鍊錶就包含環;吐過走得快得快的指標走到了鍊錶的末尾(listnode的next指向null)都沒有追上第乙個指標,那麼鍊錶就不包含環。
(2)第二步是找到環中節點的數目,這一步的目的就是為尋找環的入口做鋪墊。我們在上面提到判斷乙個鍊錶裡面是否有環時用到了一快一慢兩個指標。如果兩個指標相遇,則表明鍊錶中存在環。兩個指標相遇的節點一定是在環中。可以從這個節點出發,一邊繼續向前移動一邊計數,當再次回到這個節點時,就可以得到環中節點數了。
(3)第三步是找到環的入口。我們還可以利用兩個指標來解決這個問題。先定義兩個指標p1和p2指向鍊錶的頭結點。如果鍊錶中的環有n個節點,則指標p1先在鍊錶上向前移動n步,然後兩個指標以相同的速度向前移動。當第二個指標指向環的入口節點時,第乙個指標已經圍繞著環走了一圈,又回到了入口節點。
解題**:
1.正確**
/*
struct listnode
};*/
class solution
//找到環的入口
//先移動p1,移動次數為環中節點的個數
p1=phead;
for(int i=0;inext;
//再移動p2
listnode* p2=phead;
while(p1!=p2)
return p1;
}private:
listnode* meetingnode(listnode* phead)
return nullptr;
}};
2.自己寫的沒有通過所有用例
您的**已儲存
答案錯誤:您提交的程式沒有通過所有的測試用例
case通過率為75.00%
用例: {},
對應輸出應該為:1
你的輸出為:5
/*
struct listnode
};*/
class solution
return nullptr;
}};
劍指offer(面試題23) 鍊錶中環的入口結點
題目 如果乙個單向鍊錶包含環,如何找出環的入口結點。include using namespace std struct listnode 檢查是否存在環 listnode checkcicle listnode phead else return null listnode findcirclee...
劍指offer 面試題 23 鍊錶中環的入口結點
給定乙個鍊錶,若其中包含環,則輸出環的入口節點。若其中不包含環,則輸出null。給定如上所示的鍊錶 1,2,3,4,5,6 2注意,這裡的2表示編號是2的節點,節點編號從0開始。所以編號是2的節點就是val等於3的節點。則輸出環的入口節點3.definition for singly linked ...
劍指offer 面試題23 鍊錶中環的入口結點
開始行動,你已經成功一半了,獻給正在奮鬥的我們 乙個鍊錶中包含環,如何找出環的入口結點?如圖一,環的入口節點是3 圖一 這道題,首選用我們程式設計師的思維抽象一下,其實就是在遍歷鍊錶的時候找到第乙個重複節點,這個節點就是入環點,如果遍歷的過程中,寫乙個節點是空的話,就說明這個鍊錶不成環 如果上面說的...