一开始没有考虑到快指针会越界,后面快指针第二步加了个if判断;
然后是一开始指向同个节点,不应该在循环里判断不相等继续循环,应该作为终止条件;

原版:

class Solution {
public:
    bool hasCycle(ListNode *head) {
      // if (head == nullptr || head->next == nullptr) {
      // 注意:!!!单个节点也可以成环,原先考虑不周但是测试都过了。。。
      if (head == nullptr) {
        return false;
      }
      
      ListNode *fast = head, *slow = head;
      
      while (fast && slow) {  // 这里的slow判断其实多余了,无环时一定是fast先到
        fast = fast->next;
        if (fast)   // 这里防止fast为空导致越界访问
          fast = fast->next;
        slow = slow->next;
        if (fast == slow)   //  有环退出循环,其实可以直接返回
          break;
      }
      
      return fast == slow;  // 有环相等为true
    }
};

官方版本(更好)

class Solution {
public:
    bool hasCycle(ListNode *head) {
      // if (head == nullptr || head->next == nullptr) {
      // 同上
      if (head == nullptr) {
        return false;
      }
      
      ListNode *fast = head, *slow = head;
      
      while (fast && fast->next) {
        fast = fast->next->next;
        slow = slow->next;
        if (fast == slow) 
          return true;
      }
      
      return false;
    }
};