23.鏈表中環的入口節點
題目描述
一個鏈表中包含環,請找出該鏈表的環的入口結點。
沒有環則返回空。
分析
思路和《劍指offer》上的一樣。分三個步驟。
第一步,判斷鏈表中是否存在環。
第二步,判斷環的大小
第三步,得到環的入口節點
代碼
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
if (pHead == NULL || pHead->next == NULL) return NULL;
// 判斷是否存在環
ListNode* p1 = pHead;
ListNode* p2 = pHead;
p1 = p1->next;
p2 = p2->next;
p2 = p2->next;
bool isLoop = false;
while (p1 != NULL && p2 != NULL) {
if (p1 == p2 && p2 != NULL) {
isLoop = true;
break;
}
p1 = p1->next;
p2 = p2->next;
if (p2 != NULL) {
p2 = p2->next;
}
}
if (!isLoop) return NULL;
// 得到環的大小
int num_node = 1;
p2 = p2->next;
while (p1 != p2) {
num_node++;
p2 = p2->next;
}
// 得到環的入口節點
int idx = 1;
p1 = pHead;
p2 = pHead;
while (idx <= num_node) {
p1 = p1->next;
idx++;
}
while (p1 != p2 && p1 != NULL) {
p1 = p1->next;
p2 = p2->next;
}
return p1;
}
};