博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode:linked_list_cycle_II
阅读量:5047 次
发布时间:2019-06-12

本文共 919 字,大约阅读时间需要 3 分钟。

一、     题目

        给定一个链表,假设链表中有环则返回环的開始节点,否则返回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;

 

 

/** * 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;    }};

转载于:https://www.cnblogs.com/zfyouxi/p/4278637.html

你可能感兴趣的文章
webStrom智能提示忽略首字母大小写问题
查看>>
层叠加的五条叠加法则(一)
查看>>
设计模式六大原则(5):迪米特法则
查看>>
对Feature的操作插入添加删除
查看>>
javascript String
查看>>
ecshop 系统信息在哪个页面
查看>>
【转】码云source tree 提交超过100m 为什么大文件推不上去
查看>>
Oracle数据库的增、删、改、查
查看>>
MySql执行分析
查看>>
git使用中的问题
查看>>
yaml文件 .yml
查看>>
linux字符集修改
查看>>
phpcms 添加自定义表单 留言
查看>>
mysql 优化
查看>>
读书笔记 ~ Nmap渗透测试指南
查看>>
WCF 配置文件
查看>>
动态调用WCF服务
查看>>
oracle导出/导入 expdp/impdp
查看>>
类指针
查看>>
css修改滚动条样式
查看>>