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

目录

1、环形链表 |

2、环形指针 || 


1、环形链表 |

环形链表 |

题目描述:

 

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

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

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

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

看看代码:

 public boolean hasCycle(ListNode head) {
        if(head == null) return false;
        ListNode fast = head,slow = head;
        while(fast != null && fast.next != null){          
            fast = fast.next.next;
            slow = slow.next;
            if(fast == slow) return true;
        }
        return false;
    }

 

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步,此时到达指定位置;

代码如下:

public ListNode detectCycle(ListNode head) {
        ListNode fast = head,slow = head;
        while(true){
            if(fast == null || fast.next == null) return null;
            fast = fast.next.next;
            slow = slow.next;
            if(fast==slow) break;
        }
        fast = head;
        while(fast != slow){
            fast = fast.next;
            slow = slow.next;
        }
        return fast;
    }

持续更新leetcode热题中~~

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你食不食油饼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值