数学公式推导法解决问题
Given a linked list, return the node where the cycle begins. If there is no cycle, return null.
///
如果按照常规的思想,我们可以遍历一遍节点,使用O(n)的空间复杂度,当然这就不需要人来思考了
///以刷题的要求,首先判断是否有圈快慢法,然后相遇后我们发现,位置之间的联系是存在的,
假设几个未知数,来求解方程,利用方程来求解的思想在小学奥数中想必经常出现
在我们刷题过程我们应该经常使用。
点的位置要有参考系,我想这点大家都懂
所以必须,由head开始,circlestarting-point(CP)点的距离为L,meeting-point(M)到CP的距离为S
M到CP---一圈的距离为Y,每圈长度为C,于是我们可以得到几个方程。
   2 * T = T + N1 * C    N1=0,1,2...
N1为快慢指针跑的圈数差
   T = N1 * C
   2 * T = L + N2 * C + S    N2=0,1,2...
N2为慢指针跑的圈数
整理后(2N1-N2)×C=L+S
设N3于是
   N3 * C = L + S  
  C=L+Y  (N3 - 1) * C + S + Y = L + S
  (N3 - 1) * C + Y = L
class Solution {
    public:
        ListNode *detectCycle(ListNode *head) {
            ListNode* dummy=new ListNode(-1);
            dummy->next=head;
            ListNode *slow=dummy, *fast=dummy;
            bool flag=false;
            while(fast && fast->next){
                slow=slow->next;
                fast=fast->next->next;
                if(fast==slow)  { flag=true; break; }
            }
            if(!flag)   return NULL;
            ListNode* result=dummy;
            while(result != slow){
                result=result->next;
                slow=slow->next;
            }
            return result;
        }
    };
posted on 2017-11-03 16:52 flyingwaters 阅读(355) 评论(0) 收藏 举报
 
                    
                 
                
            
         
 浙公网安备 33010602011771号
浙公网安备 33010602011771号