leetcode练习题 linked-list-cycle-li

解题思路

参考https://www.nowcoder.com/questionTerminal/6e630519bf86480296d0f1c868d425ad?f=discussion

在这里插入图片描述
从上图可得出,快慢指针假设在Z处相遇,则有2 * (a + b) = a + b + n * (b + c),相当于快指针比慢指针多走了n圈,故a = (n - 1) * (b + c) + c,即快慢指针相遇之后,慢指针从头开始走,快指针从相遇点Z开始走,快慢指针将在环的入口Y相遇。

代码思路

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        if(head == NULL)
            return NULL;
        ListNode *slow = head;
        ListNode *fast = head;
        while(fast != NULL && fast->next != NULL){
            slow = slow->next;
            fast = fast->next;
            if(fast != NULL)
                fast = fast->next;
            if(slow == fast)
                break;
        }
        if(fast == NULL || fast->next == NULL)
            return NULL;
        slow = head;
        while(slow != fast){
            slow = slow->next;
            fast = fast->next;
        }
        return slow;
    }
};
发布了18 篇原创文章 · 获赞 0 · 访问量 57

猜你喜欢

转载自blog.csdn.net/qq_38303368/article/details/104972927
今日推荐