首页 > 其他分享 >LeetCode刷题(5)【链表】【环形链表II】(C语言)

LeetCode刷题(5)【链表】【环形链表II】(C语言)

时间:2022-11-17 21:32:21浏览次数:47  
标签:II slow ListNode struct fast C语言 链表 meet



环形链表I

​​LeetCode刷题(3)【链表】【环形链表】&扩展_半生瓜のblog-CSDN博客​​


环形链表II

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

这个题写起来不难,但是证明有点麻烦。

LeetCode刷题(5)【链表】【环形链表II】(C语言)_单链表

LeetCode刷题(5)【链表】【环形链表II】(C语言)_链表_02


针对这个入口点怎么求,有人给出了一个结论。

结论:一个指针从meet点开始走,一个指针从链表的开始点走,它们会在入口点相遇。(看下面的过程的时候,先别想这个结论,否则会越来越乱的,就先当不知道。)


LeetCode刷题(5)【链表】【环形链表II】(C语言)_新星计划_03

fast走的路程是slow走的路程的2倍。

slow走的路程:slow进环了以后,在一圈之内,fast一定会追上slow。因为slow走了一圈,fast都走两圈了。

slow进环之前,fast有可能在环里面转了N圈,如果入环之前的长度越长,环很小,N越大, 如果入环前的长度越短,环很大,N就是1,fast只转了1圈。

fast走的路程: L + C*N + X

slow走的路程:L + X

fast = 2*slow

L + C*N + X = 2 (L + X)

化简一下得:

C* N - X = L

再化简一下得:
( N - 1 )* C + C - X = L

C - X就是meet点到入口点的距离。

再看这个结论。

结论:一个指针从meet点开始走,一个指针从链表的开始点走,它们会在入口点相遇。

理解一下,就是一个指针从meet点出发,转转转了N-1圈,在走了一个C-X到达入口点,发生相遇。

代码实现:

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *detectCycle(struct ListNode *head) {
struct ListNode* slow = head;
struct ListNode* fast = head;
while(fast && fast->next)
{
fast = fast->next->next;
slow = slow->next;
//找到相遇点
if(fast == slow)
{
//相等即为相遇点
struct ListNode* meet = slow;
//一个指针从meet走,一个指针从head走,他们会在入口点相遇
while(head != meet)
{
head = head->next;
meet = meet->next;
}
return meet;
}
}
return NULL;
}


标签:II,slow,ListNode,struct,fast,C语言,链表,meet
From: https://blog.51cto.com/u_15333750/5866184

相关文章

  • 【线性表】之栈(C语言)
    栈​​回顾​​​​栈​​​​结构定义​​​​初始化​​​​销毁​​​​入栈​​​​出栈​​​​返回栈顶元素​​​​返回栈中元素个数​​​​判断栈是否为空​​​​......
  • 【线性表】之队列(C语言)
    队列​​队列的概念​​​​结构定义​​​​初始化​​​​销毁​​​​队尾入​​​​队头出​​​​队头出​​​​队头数据​​​​队尾数据​​​​是否为空​​​​返......
  • LeetCode刷题(7)【栈&队列】用队列实现栈(C语言)
    用队列实现栈225.用队列实现栈-力扣(LeetCode)(leetcode-cn.com)目的:用队列实现栈,从先进先出——>先进后出,1234这四个数据依次从队列1的队尾进入,要让4先出,一个队列是无法......
  • LeetCode刷题(2)【链表】【合链表&链表的中间结点】(C语言)
    我的小站——半生瓜のblog快慢指针问题:思路:定义一个快指针和一个慢指针,快指针走到结束的时候,慢指针刚好走到一半。链表的中间结点。876.链表的中间结点-力扣(LeetCode)(le......
  • LeetCode刷题(3)【链表】【环形链表】&扩展(C语言)
    我的小站——半生瓜のblog环形链表141.环形链表-力扣(LeetCode)(leetcode-cn.com)什么是链表带环:链表的最后一个元素不指向空而指向前面的某个结点。思路:快慢指针,慢指针走......
  • C语言二级错题积累(4)
    在栈中,栈项指针的动态变化决定栈中元素的个数。详细设计的人物是为软件结构体中的每一个模块确定实现算法和局部数据结构,用某种选定的表达工具表示算法和数据结构的细节。扇......
  • C语言二级错题积累(5)
    常用的连续存储管理技术有固定分区存储管理和可变分区存储管理。程序流程图中带有箭头的线段表示的是控制流。若二叉树没有叶子结点,则为空二叉树。带链栈的栈底指针是随栈的......
  • C语言实现贪吃蛇小程序
    参考视频https://www.bilibili.com/video/BV1LN41197zV?from=search&seid=15462998985727977257代码有点缺陷:1.食物有可能会生成在吃不到的地方2.吃掉食物的音效添加失败//......
  • C语言实现推箱子小游戏
    C语言实现推箱子小游戏包括黑窗和图形界面参考视频https://www.bilibili.com/video/BV1By4y1a79o?t=4428BUG:当人进入到目的地的时候会无法移动。#include<stdio.h>#incl......
  • C语言自定义数据类型
    结构体参考视频:https://www.bilibili.com/video/BV1oi4y1g7CF?p=58大纲:结构体的声明结构体的自引用结构体内存对齐结构体传参结构体实现位段(位段的填充&可移植性)charshor......