题目描述:
    image.png
    image.png
    解析:快慢指针,慢指针一次走一步,快指针一次走两步,如果重合,必有环

    1. public class Solution {
    2. public boolean hasCycle(ListNode head) {
    3. //快慢指针
    4. if (head==null) return false;
    5. ListNode p1=head;
    6. ListNode p2=head;
    7. while(p1!=null && p2!=null && p2.next!=null) {
    8. p1=p1.next;
    9. p2=p2.next.next;
    10. if(p1==p2) return true;
    11. }
    12. return false;
    13. }
    14. }

    如果要找到入环的第一个节点,则需要有一个指针返回链表头节点,然后两个指针都是一次走一步,再次重合就是入环的首节点

    1. public class Solution {
    2. public ListNode detectCycle(ListNode head) {
    3. if(head==null || head.next==null) return null;
    4. ListNode p1=head;
    5. ListNode p2=head;
    6. while(p1!=null && p2!=null && p2.next!=null){
    7. p1=p1.next;
    8. p2=p2.next.next;
    9. if(p1==p2) { //说明有环
    10. p1=head; //重新指向链表头节点
    11. while(p1!=p2){ //直到p1==p2的时候
    12. p1=p1.next;
    13. p2=p2.next;
    14. }
    15. return p1;
    16. }
    17. }
    18. return null;
    19. }
    20. }