142. 环形链表 II

142. 环形链表 II_第1张图片

主要的两点:
1.走a+nb步一定是在环入口
2.第一次相遇时慢指针已经走了nb步
(nb+a = a)在入口相遇

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode *slow = head;
        ListNode *fast = head;
        while(1){
            if(!fast||!fast->next)
                return nullptr;
            fast = fast->next->next;
            slow = slow->next;
            if(slow==fast)
                break;
        }
        fast=head;
        while(slow!=fast){
            slow = slow->next;
            fast = fast->next;
        }
        return slow;
    }
};
  1. 环形链表
class Solution {
public:
    bool hasCycle(ListNode *head) {
        ListNode *fast = head;
        ListNode *slow = head;
        do{
            if(!fast||!fast->next)
                return false;
            else{
                fast = fast->next->next;
                slow = slow->next;
            }
        }while(slow!=fast);
        return true;
    }
};

你可能感兴趣的:(LeetCode,链表,算法)