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
相关文章
|
4天前
|
算法
LeetCode第24题两两交换链表中的节点
这篇文章介绍了LeetCode第24题"两两交换链表中的节点"的解题方法,通过使用虚拟节点和前驱节点技巧,实现了链表中相邻节点的交换。
LeetCode第24题两两交换链表中的节点
|
4天前
|
存储 算法
LeetCode第86题分隔链表
文章介绍了LeetCode第86题"分隔链表"的解法,通过创建两个新链表分别存储小于和大于等于给定值x的节点,然后合并这两个链表来解决问题,提供了一种简单易懂且操作原链表的解决方案。
LeetCode第86题分隔链表
|
4天前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
4天前
|
算法
LeetCode第23题合并 K 个升序链表
这篇文章介绍了LeetCode第23题"合并K个升序链表"的解题方法,使用分而治之的思想,通过递归合并链表的方式解决了这个难题。
LeetCode第23题合并 K 个升序链表
|
4天前
|
算法
LeetCode第92题反转链表 II
文章分享了LeetCode第92题"反转链表 II"的解法,通过使用四个指针来记录和更新反转链表段的头部、尾部以及前一个和后一个节点,提供了一种清晰且易于理解的解决方案。
LeetCode第92题反转链表 II
|
4天前
|
算法
LeetCode第21题合并两个有序链表
该文章介绍了 LeetCode 第 21 题合并两个有序链表的解法,通过创建新链表,依次比较两个链表的头节点值,将较小的值插入新链表,直至其中一个链表遍历完,再将另一个链表剩余部分接到新链表后面,实现合并。
LeetCode第21题合并两个有序链表
|
4天前
|
算法
LeetCode第19题删除链表的倒数第 N 个结点
该文章介绍了 LeetCode 第 19 题删除链表的倒数第 N 个结点的解法,通过使用快慢双指针,先将快指针移动 n 步,然后快慢指针一起遍历,直到快指针到达链尾,从而找到倒数第 N 个结点的前一个结点进行删除,同时总结了快慢指针可减少链表遍历次数的特点。
LeetCode第19题删除链表的倒数第 N 个结点
|
14天前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
32 5
|
11天前
|
算法 Java
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
19 0
|
11天前
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
10 0