博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Leetcode] Linked List Cycle II
阅读量:6263 次
发布时间:2019-06-22

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

Given a linked list, return the node where the cycle begins. If there is no cycle, return null.

Follow up:

Can you solve it without using extra space?

转自: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相遇了,我们拿一个从头开始走,一个从相遇的地方开始走

两个都走一步,那么再次相遇必定是环的开始节点!

代码也很精简,值得学习一下。

1 /** 2  * Definition for singly-linked list. 3  * struct ListNode { 4  *     int val; 5  *     ListNode *next; 6  *     ListNode(int x) : val(x), next(NULL) {} 7  * }; 8  */ 9 class Solution {10 public:11     ListNode *detectCycle(ListNode *head) {12         // IMPORTANT: Please reset any member data you declared, as13         // the same Solution instance will be reused for each test case.14         if(head == NULL) return NULL;15         ListNode* S = head;16         ListNode* F = head;17         18         while(F != NULL){19             if(F) F = F -> next;20             if(F) F = F -> next;21             if(S) S = S -> next;22             if(F != NULL && F == S){23                 S = head;24                 while(S != F){25                     S = S -> next;26                     F = F -> next;27                 }28                 return S;29             }30         }31         return NULL;32     }33 };

下面是自己写的:

1 /** 2  * Definition for singly-linked list. 3  * struct ListNode { 4  *     int val; 5  *     ListNode *next; 6  *     ListNode(int x) : val(x), next(NULL) {} 7  * }; 8  */ 9 class Solution {10 public:11     ListNode *detectCycle(ListNode *head) {12         if (head == NULL) return NULL;13         ListNode *slow = head, *fast = head;14         while (slow != NULL && fast != NULL) {15             if (slow->next != NULL) {16                 slow = slow->next;17             } else {18                 return NULL;19             }20             if (fast->next != NULL) {21                 fast = fast->next;22             } else {23                 return NULL;24             }25             if (fast->next != NULL) {26                 fast = fast->next;27             } else {28                 return NULL;29             }30             if (slow == fast) {31                 break;32             }33         }34         slow = head;35         while (slow != fast) {36             slow = slow->next;37             fast = fast->next;38         }39         return slow;40     }41 };

 

你可能感兴趣的文章
如何重置Sitecore CMS中的管理员密码
查看>>
[SilverLight]DataGrid实现批量输入(like Excel)(补充)
查看>>
PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
查看>>
NSBundle介绍
查看>>
POJ1811_Prime Test【Miller Rabin素数測试】【Pollar Rho整数分解】
查看>>
ConnectString中enlist设置的含义
查看>>
潜移默化学会WPF(企业经验篇)--Log4Net(二)
查看>>
轻量级面向SQL的MySQL开源监控工具
查看>>
ubuntu 卸载 程序软件
查看>>
iOS 6,5支持 portrait,landscape (横竖屏的处理)
查看>>
FineUI v3.2.2发布了!(7 天后再出新版,给不给力?)
查看>>
Quartz在Spring中动态设置cronExpression (spring设置动态定时任务)------转帖
查看>>
vb webbrower 相对坐标
查看>>
原始的js代码和jquery对比
查看>>
.net和java和谐相处之安卓客户端+.net asp.net mvc webapi 2
查看>>
Dynamic CRM 2013学习笔记(十六)用JS控制Tab可见,可用
查看>>
jquery对象和javascript对象相互转换
查看>>
laravel开启调试模式
查看>>
Spring aop的实现原理
查看>>
ADO.NET一小记-select top 参数问题
查看>>