【劍指**】23.鏈表中環的入口節點

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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章