• leetcode链表系列(环形链表篇)


    目录

    1、环形链表 |

    2、环形指针 || 


    1、环形链表 |

    环形链表 |

    题目描述:

     

     思路:要我们判断链表中是否有环,如果有环就意味着链表没有中止点,会进入循环;

    所以我们只需要引入一个快慢指针,快指针fast每次移动两个节点,慢指针slow每次移动一个节点

    所以只要链表有环,快慢指针必定有相交的一刻,相交后就返回true;

    如果无环,那我只要当fast ==null || fast.next == null时,退出循环即可,返回false;

    看看代码:

    1. public boolean hasCycle(ListNode head) {
    2. if(head == null) return false;
    3. ListNode fast = head,slow = head;
    4. while(fast != null && fast.next != null){
    5. fast = fast.next.next;
    6. slow = slow.next;
    7. if(fast == slow) return true;
    8. }
    9. return false;
    10. }

     

    2、环形指针 || 

     环形链表 ||

    题目描述:

     

     

    思路: 首先我们依旧采用第一题的快慢指针的思路,fast指针一次走两步,slow指针一次走一步

    设从head到环开始的距离为a,环的长度为b,fast指针走过的距离f,慢指针走过的距离s

    首先我们能确定的是,当快慢指针第一次相遇时:

    由于快指针一次走两步,慢指针一次一步,所以f = 2s

    快指针与慢指针相遇,就要比满指针多走n个环的距离,f = s + nb;

    我们可以得到f = 2nb,s = nb;

    我们慢指针s第一次相遇走了nb,又可知如果慢指针想走到环开始的位置要走a + nb

    所以我们只需要让慢指针再走a步,就可以到达指定位置;

    所以我们再次设置双指针,设置另一个指针在head位置,当这个指针再与慢指针slow,相遇时,正好又走了a步,此时到达指定位置;

    代码如下:

    1. public ListNode detectCycle(ListNode head) {
    2. ListNode fast = head,slow = head;
    3. while(true){
    4. if(fast == null || fast.next == null) return null;
    5. fast = fast.next.next;
    6. slow = slow.next;
    7. if(fast==slow) break;
    8. }
    9. fast = head;
    10. while(fast != slow){
    11. fast = fast.next;
    12. slow = slow.next;
    13. }
    14. return fast;
    15. }

    持续更新leetcode热题中~~

  • 相关阅读:
    firefly3399 移植linux5.15.80 - 2022-11-27
    ML 模型融合讲解 (bagging, boosting, stacking, blending, 加权)+面试必考知识点
    一招解决vue页面自适应布局
    正则表达式
    StarBlog开源博客项目 - 2023年底更新内容一览
    【c++ debug】cmake编译报错 No such file or directory
    S-3A5001 DPDK性能优化
    紧急事件,停电导致安森美韩国厂全线停工 | 百能云芯
    计算机网络-应用层了解
    中小型企网搭建
  • 原文地址:https://blog.csdn.net/weixin_72076848/article/details/126176307