LeetCode 之 Linked List Cycle I II — C++ 实现
来源:互联网 发布:童话淘宝店 编辑:程序博客网 时间:2024/04/29 04:04
Linked List Cycle
Given a linked list, determine if it has a cycle in it.
Follow up:
Can you solve it without using extra space?
附加:
能否不额外分配空间。
分析:
维护两个指针,ne 每次移动两个节点,pre 每次移动一个节点,则 ne 是 pre 的 2 倍,若有环,pre 和 ne 一定会相遇。
class Solution {public: bool hasCycle(ListNode *head) { if(!head) { return false; } ListNode *pre = head, *ne = head; //ne速度是pre速度的2倍,若有环一定会相遇 while(ne->next) { pre = pre->next; if(ne->next->next) { ne = ne->next->next; if(pre == ne) { return true; } } else //链表有尾,则没有环 { break; } } return false; }};
Linked List Cycle II
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?
给定一个链表,验证是否存在环。
附加:
能否不额外分配空间。
分析:
维护两个指针,ne 每次移动两个节点,pre 每次移动一个节点,则 ne 是 pre 的 2 倍,若有环,pre 和 ne 一定会相遇。设表头 X,Y 为环入口,Z 为 pre 和 ne 相遇点,则他们通过的距离 Lpre = a+b, Lne = a+b+c, ne是 pre 的 2 倍,则 Lne = 2Lpre, 所以 a = c.因此,当第一次相遇时,pre 继续向前走,ne 重新从表头开始走,则再次相遇点就是环的起点。(图为转载)
class Solution {public: ListNode *detectCycle(ListNode *head) { if(!head) { return NULL; } bool hasCycle = 0; ListNode *pre = head, *ne = head; //ne 速度为 pre 的2倍,有环一定相遇 while(ne->next) { pre = pre->next; if(ne->next->next) { ne = ne->next->next; if(pre == ne)//有环 { hasCycle = true; break; } } else { break; } } //如存在环,ne从头开始走,pre继续走,则相遇在环起点处 if(hasCycle) { ne = head; while(ne != pre) { pre = pre->next; ne = ne->next; } return pre; } return NULL; }};
0 0
- LeetCode 之 Linked List Cycle I II — C++ 实现
- leetcode linked-list-cycle(i 、ii)(java实现)
- leetcode Linked List Cycle I II
- LeetCode:Linked List Cycle I & II
- LeetCode :: Linked List Cycle I and II
- leetcode Linked List Cycle(I II)(*)
- leetcode-Linked List Cycle I & II
- LeetCode: linked list cycle I and II
- 【LeetCode】Linked List Cycle I&II
- LeetCode - Linked List Cycle I &II
- LeetCode | Linked List Cycle I,II
- LeetCode: Linked List Cycle I & II
- leetcode之linked List cycle && linked List cycle II
- [C++]LeetCode: 74 Linked List Cycle II
- [leetcode-142]Linked List Cycle II(c)
- LeetCode之Linked List Cycle II
- LeetCode之Linked List Cycle II
- leetcode之Linked List Cycle II
- 红色高跟鞋
- 通过Java反射在运行时修改TimerTask的执行周期并且立即生效
- ASM(二) 利用Core API 变更类成员
- apk文件的修改及签名
- MyBatis学习(一)- 搭建MyBatis项目
- LeetCode 之 Linked List Cycle I II — C++ 实现
- 时光流逝我慢慢明白是什么
- You can Solve a Geometry Problem too(线段相交问题)
- MyBatis学习(二) - 初探Mapper XML 文件
- dede仿站
- http://blog.csdn.net/tx18/article/details/46319095
- MyBatis学习(三)- 小结
- 苏宁工作一月总结
- MyBatis学习(四)- 动态SQL