题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
解题思路:
快慢指针,即慢指针一次走一步,快指针一次走两步,两个指针从链表起始位置开始运行,如果链表带环,则一定会在环中相遇,否则快指针率先走到链表的末尾。
扩展:
1、为什么快指针每次走两步,慢指针走一步可以?
2、快指针一次走3步,走4步,...n步行吗?
所以解决该题时,我们使用快慢指针,即慢指针一次走一步,快指针一次走两步,两个指针从链表起始位置开始运行,如果链表带环,则一定会在环中相遇。
- public class Solution {
- public boolean hasCycle(ListNode head) {
- ListNode fast = head;
- ListNode slow = head;
- while (fast != null && fast.next !=null) {
- fast = fast.next.next;
- slow = slow.next;
- if(fast == slow) {
- return true;
- }
- }
- return false;
- }
- }
另一种写法:
- public boolean hasCycle2(ListNode head) {
- ListNode fast = head;
- ListNode slow = head;
- while (fast != null && fast.next !=null) {
- fast = fast.next.next;
- slow = slow.next;
- if(fast == slow) {
- break;
- }
- }
- if (fast == null||fast.next == null) {
- return false;
- }
- return true;
- }