前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode刷题(3)【链表】【环形链表】&扩展(C语言)

LeetCode刷题(3)【链表】【环形链表】&扩展(C语言)

作者头像
半生瓜的blog
发布2023-05-12 21:17:49
1370
发布2023-05-12 21:17:49
举报
文章被收录于专栏:半生瓜のblog半生瓜のblog


环形链表

141. 环形链表 - 力扣(LeetCode) (leetcode-cn.com)

什么是链表带环:链表的最后一个元素不指向空而指向前面的某个结点。

思路:快慢指针,慢指针走一步,快指针走两步,二者先后 进入环内进行追逐,最终会在某个点相遇。

代码语言:javascript
复制
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
bool hasCycle(struct ListNode *head) {
    struct ListNode* slow = head;
    struct ListNode* fast = head;
    while(fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
        if(slow == fast)
            return true;
    }
    return false;
}

扩展:

请证明:

(1)slow和fast一定会在环里面相遇呢?有没有可能永远追不上? 答: 当slow 走1步,fast走2步时,一定可以追上。 若slow和fast已经进入环中,追逐已经开始了,假设他们之间的距离是N,slow走1步,fast走2步,二者的距离每次缩减1,N,N-1,N-2,…0,直到相遇。

(2)slow一次走1步,fast一次走3不行不行?4不行不行? 答: 不一定可以追上,甚至有可能会进入死循环。我比你快不一定追上,因为存在错过。若开始追逐,假设二者距离为N,假设slow走1步,fast走3步,距离每次缩减2,N,N-2,N-4,N-6…。如果N是偶数最后会减到0,如果N是偶数则减到-1,距离为0代表相遇,距离为-1代表反超了,进入新的追逐,他们之间的距离是 C-1(假设C 是环的长度),如果C-1是偶数,就可以追上,如果C-1是奇数,就永远追不上,因为是奇数的时候又像开始那样反超,距离又是C-1,就永远追不上。 其他fast步数同理分析。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-05-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档