zoukankan      html  css  js  c++  java
  • [leetcode]Linked List Cycle II

    比I麻烦点的就是找到循环开始点TAT

    I只是判断是否循环。要求不使用额外空间(不然hash就可以了

    按I的思路,我们又慢指针S和快指针F。。。F走两步,S走一步。。。若有环,必定相遇。

    画个图(很丑勿喷

    假设在红色凸起的地方相遇了。

    F走的路程应该是S的两倍

    S = x + y

    F = x + y + z + y = x + 2y + z

    2*S = F

    2x+2y = x + 2y + z

    得到x = z

    也就是从head到环开始的路程 = 从相遇到环开始的路程

    那么。。。只要S和F相遇了,我们拿一个从头开始走,一个从相遇的地方开始走

    两个都走一步,那么再次相遇必定是环的开始节点!

    /**
     * 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) {
            // IMPORTANT: Please reset any member data you declared, as
            // the same Solution instance will be reused for each test case.
            if(head == NULL) return NULL;
            ListNode* S = head;
            ListNode* F = head;
            
            while(F != NULL){
                if(F) F = F -> next;
                if(F) F = F -> next;
                if(S) S = S -> next;
                if(F != NULL && F == S){
                    S = head;
                    while(S != F){
                        S = S -> next;
                        F = F -> next;
                    }
                    return S;
                }
            }
            return NULL;
        }
    };
  • 相关阅读:
    以流的形式将文件写入页面,直接下载
    多线程异步处理示例
    windows端口占用查看
    Spring MVC中默认的ResponseBody为String的乱码问
    inode安装
    uploadfy使用
    动态时间工具类
    常量设置
    项目配置热部署
    springboot异常:yml文件无法识别
  • 原文地址:https://www.cnblogs.com/x1957/p/3406448.html
Copyright © 2011-2022 走看看