Leetcode 142. Linked List Cycle II 双指针-快慢指针

  • 注意初始判空和只有1元素的情况
  • 注意[1,2] -1(无环)的情况
    • fast走到空时,slow走到1位置。紧跟着,fast重新从0开始走,此时要注意slow的空判断
  • 大体思路如图:
    Leetcode 142. Linked List Cycle II 双指针-快慢指针_第1张图片
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        if(!head || !head->next) return nullptr;
        ListNode* fast = head;
        ListNode* slow = head;
        while(fast && fast->next){
            fast = fast->next->next;
            slow = slow->next;
            if(fast == slow) break;
        }
        fast = head;
        while(slow){
            if(fast==slow) return fast;
            fast=fast->next;
            slow=slow->next;
        }
        return nullptr;
    }
};

你可能感兴趣的:(算法)