码迷,mamicode.com
首页 > 其他好文 > 详细

Linked List Cycle II

时间:2015-05-30 17:58:29      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:

感觉又是一道数学题,没想了,直接看的人家是怎么做的。

转自:http://www.cnblogs.com/x1957/p/3406448.html

比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;
    }
};
技术分享

Linked List Cycle II

标签:

原文地址:http://www.cnblogs.com/qiaozhoulin/p/4540678.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!