142. linkedlist cycle
2016-07-03 11:23
302 查看
链表找环,以及环的入口的最经典做法。快慢指针法。快慢指针同时从开头出发,快指针每次走两步,慢指针每次走一步,如果会相遇,一定有环,当相遇时,将快指针重新移动到head,然后每次走一步,两指针再次相遇就是环的入口。
![](https://img-blog.csdn.net/20160703104730209)
简单来说就是,head到入口距离为a, 入口到相遇为b, 相遇到入口为c, 这个是按照链表走向定的距离。然后我们可以得到,2*(a+b) = a + b + c + b; 所以a = c. 所以把快指针移动回head,每次走一步,会在入口相遇。
注意:
1. 判空很重要,fast & fast->next, 因为fast保证开头有效,不用判断head为空的情况,保证fast->next不为空,就可以取fast->next->next。
2. 自身就是一个环,相遇点就是开头。需要判断下。
返回入口:
我的leetcode答案:
简单来说就是,head到入口距离为a, 入口到相遇为b, 相遇到入口为c, 这个是按照链表走向定的距离。然后我们可以得到,2*(a+b) = a + b + c + b; 所以a = c. 所以把快指针移动回head,每次走一步,会在入口相遇。
bool hasCircle(Node* head, Node* &encounter) { Node *fast = head, *slow = head; while(fast && fast->next) { fast = fast->next->next; slow = slow->next; if(fast == slow) { encounter = fast; return true; } } encounter = NULL; return false; }
注意:
1. 判空很重要,fast & fast->next, 因为fast保证开头有效,不用判断head为空的情况,保证fast->next不为空,就可以取fast->next->next。
2. 自身就是一个环,相遇点就是开头。需要判断下。
返回入口:
Node* findEntry(Node* head, Node* encounter) { Node *p1 = head, *p2 = encounter; while(p1 != p2) { p1 = p1->next; p2 = p2->next; } return p1; }
我的leetcode答案:
class Solution { public: ListNode *detectCycle(ListNode *head) { ListNode *fast = head; ListNode *slow = head; int cycle = 0; while (fast && fast->next) { //判空很重要 fast = fast->next->next; slow = slow->next; if (fast == slow) { cycle = 1; break; } } if (cycle == 1) { if (fast == head) return head; // 判断是否自己就是个环 fast = head; while (true) { fast = fast->next; slow = slow->next; if (fast == slow) return fast; } } else return NULL; } };
相关文章推荐
- markdownpad
- Codeforces Round #360 (Div. 2) D. Remainders Game(中国剩余定理)
- MySQL 的 RowNum 实现
- 16.8
- 自动化测试.工具
- TP3.2.3 Auth认证
- 关于建站和域名的杂谈
- poj2112 Electricity(割点应用)
- 使用libnet_build_tcp_options设置options数据
- redis的发布订阅模式
- Arrays.sort Comparator
- 常见面试之机器学习算法思想简单梳理
- 【神器】vimum在浏览器中键盘操作选择、复制、粘贴,键盘党的最爱
- storm中 worker executor task之间的关系
- 【bzoj2055】【80人环游世界】【有上下界的费用流】
- php+JQuery+Ajax简单实现页面异步刷新
- 移动弱网测试
- github atom编辑器前端开发实战(一)- 一键用 chrome 浏览器打开当前编辑的文件,亲测可用
- 数据结构--AVL树
- h5+css 水平菜单制作