LeetCode | 141. 环形链表

LeetCode | 141. 环形链表

OJ链接

LeetCode | 141. 环形链表_第1张图片

思路:

这里我们可以使用快慢指针来解决问题


  • slow一次走两步
  • fast一次走一步
  • 当slow和fast相遇的时候就说明带环,否则就是否

LeetCode | 141. 环形链表_第2张图片

代码如下:

bool hasCycle(struct ListNode *head) {
    struct ListNode*slow = head,*fast = head;
    while(fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
        if(fast == slow)
            return true;
    }
    return false;
}

那么有几个问题

  • slow一次走1步,fast一次走两步,一定会相遇吗?
    • slow进环后,fast和slow的距离变化,每次追击距离缩小1,距离为0的时候就追上了~~

  • slow一次走1步,fast一次走三步,一定会相遇吗?
    • 如果N是偶数直接就追上了
    • 如果N是奇数,C是奇数,第一轮错过了,第二轮就追上了
    • 如果N是奇数,C是偶数,就永远追不上~~

这里反转来了,那么N是奇数,C是偶数时就追不上,这个条件是否成立?请证明!

  • 结果是条件不成立~~

证明:

LeetCode | 141. 环形链表_第3张图片

  • 如果N是偶数直接就追上了
  • 如果N是奇数,C是奇数,第一轮错过了,第二轮就追上了
  • 如果N是奇数,C是偶数,就永远追不上
  • 2L = n * C -N
  • 偶数 = n * 偶数 - 奇数 ---->永远追不上的条件是不成立的

  • slow一次走n步,fast一次走m步,一定会相遇吗?m>n>1

    • 这个问题和上一个问题很相似
    • 距离缩小m-n(>=1的整数)N%(M-N) == 0

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