环形链表Ⅱ-力扣

第一种解法时哈希表,set在使用insert插入时,会返回一个pair,如果pair的值为0,则插入失败,那么返回这个插入失败的节点,就是入环的第一个节点,代码如下:

cpp 复制代码
/**
 * 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) {
        unordered_set<ListNode*> set;
        auto cur = head;
        while(cur != NULL){
            if(set.insert(cur).second){
                cur = cur->next;
            }else{
                return cur;
            }
        }
        return NULL;
    }
};

第二种快慢指针的写法,数学推导相当精妙,推到过程可以参考代码随想录-环形链表Ⅱ

参考代码:

cpp 复制代码
class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode *slow = head, *fast = head;
        while (fast != nullptr) {
            slow = slow->next;
            if (fast->next == nullptr) {
                return nullptr;
            }
            fast = fast->next->next;
            if (fast == slow) {
                ListNode *ptr = head;
                while (ptr != slow) {
                    ptr = ptr->next;
                    slow = slow->next;
                }
                return ptr;
            }
        }
        return nullptr;
    }
};
相关推荐
草履虫建模7 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
VT.馒头11 小时前
【力扣】2721. 并行执行异步函数
前端·javascript·算法·leetcode·typescript
Mr Xu_14 小时前
告别硬编码:前端项目中配置驱动的实战优化指南
前端·javascript·数据结构
czxyvX14 小时前
017-AVL树(C++实现)
开发语言·数据结构·c++
数智工坊14 小时前
【数据结构-队列】3.2 队列的顺序-链式实现-双端队列
数据结构
elseif12314 小时前
【C++】并查集&家谱树
开发语言·数据结构·c++·算法·图论
徐小夕@趣谈前端15 小时前
Web文档的“Office时刻“:jitword共建版2.0发布!让浏览器变成本地生产力
前端·数据结构·vue.js·算法·开源·编辑器·es6
不穿格子的程序员15 小时前
从零开始写算法——普通数组篇:缺失的第一个正数
算法·leetcode·哈希算法
Nebula_g15 小时前
线程进阶: 无人机自动防空平台开发教程(更新)
java·开发语言·数据结构·学习·算法·无人机
xuxie9916 小时前
day 23 树
数据结构