zoukankan      html  css  js  c++  java
  • leetcode:linked_list_cycle_II

    一、     题目

            给定一个链表,假设链表中有环则返回环的開始节点,否则返回NULL。要求不用额外的空间完毕。

    二、     分析

           在I中,我们推断环的存在,即用slow和fast两个指针,设定步长fast=2;slow=1;假设两个指针能够相遇则环存在,此时假设二者相遇我们仅仅需将slow=head;同一时候设置两者步长都为1,则两者再次相遇的节点即为环的開始节点。

    推导过程:(图烂勿吐)

                    

              当两者第一次相遇时,

              slow走过S1=x + y;

              fast走过S2=x + y + z + y,

             又知S2=2 * S1;

             所以,2 *(x+y) = x + y + z + y;

             故,x = z;

     

     

    <span style="font-size:18px;">/**
     * 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) {
           ListNode *slow = head;
    	   ListNode *fast = head;
    	   
    	   while(fast!=NULL&&fast->next != NULL) {
    	   	slow = slow->next;
    	   	fast = fast->next->next;
    	   	if(slow==fast) break; 
    	   }  
    	   if(fast==NULL||fast->next==NULL) {
    	   	return NULL;
    	   }
    	   slow=head;
    	   while(slow!=fast) {
    	   	slow = slow->next;
    	   	fast = fast->next;
    	   }
    	   return fast;
        }
    };</span>

  • 相关阅读:
    第二周作业
    7-2 求最大值及其下标
    第十一周作业
    第九周编程总结
    第八周作业
    第七周作业
    第六周作业
    第五周作业
    第4周作业
    第三周作业
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4278637.html
Copyright © 2011-2022 走看看