025环形链表
环形链表题目链接https://leetcode.cn/problems/linked-list-cycle/description/?envTypestudy-plan-v2envIdtop-100-liked我的解答public boolean hasCycle(ListNode head) { ListNode fasthead, slowhead; while(fast!nullfast.next!null){ fastfast.next.next; slowslow.next; if(fastslow){ return true; } } return false; }分析代码的时间复杂度为O(n)空间复杂度为O(1)。解题思路快指针和慢指针都从链表起点出发快指针一次走两步慢指针一次走一步若快指针与慢指针能相遇则链表存在环。看了官方题解后的解答//方法一哈希表 //时间复杂度O(n) //空间复杂度O(n) public boolean hasCycle(ListNode head) { SetListNode set new HashSet(); ListNode curhead; while(cur!null){ if(!set.add(cur)){ return true; } curcur.next; } return false; } //方法二快慢指针 //时间复杂度O(n) //空间复杂度O(1) public boolean hasCycle(ListNode head) { if(headnull||head.nextnull){ return false; } ListNode slowhead, fasthead.next; while(fast!slow){ if(fastnull||fast.nextnull){ return false; } slowslow.next; fastfast.next.next; } return true; }分析 1、方法一采用哈希表每次访问到一个元素就看哈希表中是否已经存在若存在就有环若不存在就放入哈希表。 2、方法二采用快慢指针基本原理是Floyd 判圈算法又称龟兔赛跑算法快指针一次走两步慢指针一次走一步若链表存在环则快慢指针终会相遇在进入环后每次移动快指针与慢指针的距离减一。 3、我的解题思路与官方题解的方法二思路一致只是实现过程略有不同官方题解的循环判断条件是快慢指针是否指向同一个位置所以假设了在head前还存在一个虚拟节点一开始慢指针从虚拟节点移动一步到head快指针从虚拟节点移动两步到head.next。而我的思路是在循环内判断快慢指针是否相遇。总结本题主要需要了解Floyd 判圈算法又称龟兔赛跑算法的思想。若存在环快指针与慢指针在环中移动之后每次距离都会减少一快指针总会追上慢指针。