首页 > 其他分享 >142. 环形链表Ⅱ

142. 环形链表Ⅱ

时间:2023-12-23 21:34:28浏览次数:24  
标签:head slow 142 环形 fast next 链表 指针

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。不允许修改链表。
整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。



示例

输入: head = [3,2,0,-4], pos=1;
输出:1

思路:

在141.环形链表的基础之上,要求返回环的入口(如果存在环)。可以使用哈希表,也可以用快慢指针。与141不同的是,slow 和 fast 都从 head 开始。假设存在环且 slow 指针和 fast 指针在 b 点相遇。当 slow 指针走了 (a+b)时,fast 指针走了 a+n(b+c)+b, 又因为 slow 指针每次走一步,fast 指针每次走 2 步,则 a+n(b+c)+b = 2(a+b), a=c+(n-1)(b+c)。在 slow 指针和 fast 指针相遇后,使用指针 ptr 指向 head,然后再同时向后移动 slow 指针和 ptr 指针。slow 指针和 ptr 指针相遇的地方为环的入口。时间复杂度为O(n),空间复杂度为O(1)。

代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        if(!head || !head->next)
            return nullptr;
        ListNode* slow = head, *fast = head;
        while(fast){
            if(fast->next == nullptr)
                return nullptr;
            slow = slow->next;
            fast = fast->next->next;
            if(fast == slow){
                ListNode* ptr = head;
                while(ptr != slow){
                    slow = slow->next;
                    ptr = ptr->next;
                }
                return ptr;
            }
        }
        return nullptr;
    }
};

题目链接

标签:head,slow,142,环形,fast,next,链表,指针
From: https://www.cnblogs.com/owmt/p/17923485.html

相关文章

  • 2023-2024-1 20231424《计算机基础与程序设计》第13周学习总结
    2023-2024-120231424《计算机基础与程序设计》第13周学习总结作业信息作业属于的课程<班级链接>(2022-2023-1-计算机基础与程序设计)作业要求<作业要求>(2022-2023-1计算机基础与程序设计第一周作业)作业目标《C语言程序设计》第12章作业正文https://www.cnblo......
  • c语言单链表
    #include<stdio.h>#include<stdlib.h>#defineERROR-1#defineSUCCESS0structlist_node{intdata;structlist_node*next;/*data*/};typedefstructlist_nodelink_list;intlist_get_size(link_list*list){intcount=0;......
  • 力扣234-回文链表
    难度:【简单】第一个想法是用栈,提交代码3次都显示解答错误。原因:第一次是没考虑一个节点的情况;第二次是不应该通过栈剩余元素个数判断单节点情况;第三次是没有考虑奇数个节点的情况。看官方题解,重新思考。用数组最容易解,时空复杂度都是O(n)。刚开始用栈是以为能优化到进阶的O(1)......
  • 链表
    约瑟夫问题(洛谷P1996)题目大意用Markdown写博客一年多了,最开始是用富文本写,后来发现Markdown更适合我,而且CSDN提供了导入导出的功能,图片可以云存储,所以导出了博文在本地也可以直接看,尤其是笔记类型很方便。所以这里总结一下自己常用模板和小伙伴们分享下[这里写一些为啥要整理......
  • 【重排链表】双指针+反转链表+合并链表
    leetcode143.重排链表题意:给定一个单链表L的头节点head,单链表L表示为:L0→L1→…→Ln-1→Ln请将其重新排列后变为:L0→Ln→L1→Ln-1→L2→Ln-2→…不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。题解:可以发现重新排列的链......
  • 【环形链表】哈希表HashSet / 双指针
    leetcode142.环形链表II题意:不可更改链表节点,给定链表表头,返回链表在环中的第一个节点,没有返回null题解:哈希表集合遍历一遍链表,哈希表集合维护链表节点,当访问到的当前节点已经在集合中,说明当前节点是所求节点哈希表集合解代码/***Definitionforsingly-linkedlist.......
  • 代码随想录算法训练营第四天|24.两两交换链表中的节点、19.删除链表的倒数第N个节点、
    LeetCode24.两两交换链表中的节点题目链接: 24.两两交换链表中的节点提示:链表问题,首先用虚拟头节点,让链表节点的处理具有一致性!!! LeetCode19.删除链表的倒数第N个节点题目链接:19.删除链表的倒数第N个节点注意点:快慢指针,链表删除元素得找到该元素的前一个元素!!! LeetCode......
  • 代码随想录算法训练营第四天| LeetCode24. 两两交换链表中的节点、19.删除链表的倒数
     LeetCode24.两两交换链表中的节点●今日学习的文章链接和视频链接代码随想录(programmercarl.com)题目链接24.两两交换链表中的节点-力扣(LeetCode)●自己看到题目的第一想法主要是把这个过程想清楚,链表交换的题目主要想明白要动几个指针,指针改变的顺序也要注意,如果......
  • 【反转子链表】模拟题
    leetcode92.反转链表II题意:反转链表的[left,right],返回链表表头题解:直接模拟删除的过程即可定义重要节点记录left位置的节点为lnode,right位置的节点为rnodelnode的前驱节点为pre,right位置的后继节点为suc初始化pre=suc=lnode=rnode=原链表表头前的虚拟节点......
  • 链表
    1.链表概念使用数组存储数据的缺陷:插入和删除需要移动数据复杂度为O(N)不好那么,是否有一种存储结构可以在插入删除数据时不需要移动数据?答案是链表什么是链表?链表是一种在逻辑上连续存储但是在物理上(内存空间)中不一定连续的存储结构,如下图链表中的每一个元......