1.题目
2.思路
时间复杂度要求O(n)--暴力搜索就不行了n * n
空间复杂度要求O(1) --哈希表记录是否访问就不行了。
利用双指针思想:两个指针同向而行,一个指针走得快fast,每次走两步;一个指针走得慢slow, 每次走一步。如果有环,终会相遇!!!!(背后的原理是什么?应该可以数学推导)
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
import java.util.*;
public class Solution {
public boolean hasCycle(ListNode head) {
if(head == null) return false;
ListNode fast = head, slow = head;
while(slow != null && fast != null){
slow = slow.next;
if(fast.next != null)
fast = fast.next.next;
else
return false;
if(fast == slow) return true;
}
return false;
}
}
3.总结
快慢指针的应用场景:
判断链表有无环
删除链表倒数第几个位置
反转链表
等等