LeetCode | 141. 环形链表

简介: LeetCode | 141. 环形链表

LeetCode | 141. 环形链表

OJ链接


思路:

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


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

代码如下:

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是偶数时就追不上,这个条件是否成立?请证明!
  • 结果是条件不成立~~

证明:

  • 如果N是偶数直接就追上了
  • 如果N是奇数,C是奇数,第一轮错过了,第二轮就追上了
  • 如果N是奇数,C是偶数,就永远追不上
  • 2L = n * C -N
  • 偶数 = n * 偶数 - 奇数 ---->永远追不上的条件是不成立的
  • slow一次走n步,fast一次走m步,一定会相遇吗?m>n>1
  • 这个问题和上一个问题很相似
  • 距离缩小m-n(>=1的整数)N%(M-N) == 0
相关文章
|
2月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
37 1
|
2月前
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
51 0
Leetcode第21题(合并两个有序链表)
|
2月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
22 0
LeetCode第二十四题(两两交换链表中的节点)
|
2月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
44 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
2月前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
91 0
|
2月前
【LeetCode 10】142. 环形链表 II
【LeetCode 10】142. 环形链表 II
22 0
|
2月前
【LeetCode 09】19 删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
17 0
|
2月前
【LeetCode 08】206 反转链表
【LeetCode 08】206 反转链表
13 0
|
2月前
【LeetCode 06】203.移除链表元素
【LeetCode 06】203.移除链表元素
33 0
|
2月前
【数据结构】环形、相交、回文、分割、合并、反转链表
【数据结构】环形、相交、回文、分割、合并、反转链表
30 0