• 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>

  • 相关阅读:
    Java代理(jdk静态代理、动态代理和cglib动态代理)
    Hive安装
    Spark 集群安装
    Flume 远程写HDFS
    Spark Idea Maven 开发环境搭建
    oracle 通不过网络的原因
    oracle一些基本问题
    linux-redhat配置yum源
    liunx虚拟机网络连接
    redhat安装jdk、tomcat、mysql
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4278637.html
Copyright © 2020-2023  润新知