腾讯常考十道算法真题:环形链表

2022-03-2709:32:58数据结构与算法Comments1,131 views字数 1238阅读模式

给定一个链表的头节点head ,返回链表开始入环的第一个节点。如果链表无环,则返回 null。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/23744.html

实例:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/23744.html

腾讯常考十道算法真题:环形链表
输入:head = [3,2,0,-4], pos = 1
输出:返回索引为 1 的链表节点
解释:链表中有一个环,其尾部连接到第二个节点。

如果判断链表是否有环,我们可以使用快慢指针,快指针是慢指针速度的两倍,当两个指针相遇时,即表示有环。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/23744.html

boolean hasCycle(ListNode head ){

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

我们可以很容易就判断有环,但是如何返回入环的第一个节点呢?我们来画个图分析一波:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/23744.html

腾讯常考十道算法真题:环形链表

假设起点为A,入环点为B,快慢指针相遇点为C,慢指针走到相遇点为k步,B到C的距离为m。设环型周长为X。因为快指针速度是慢指针的2倍。则有:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/23744.html

K-m + X + m = 2K = 快指针走的举例

所以周长X = K。相遇后,快指针到继续往前走,走到入环点B,刚好距离是X-m = K-m。而起点到B节点,距离也是K-m。因此,快慢指针相遇后,慢指针回到起点,这时候快慢指针一样的速度走,相遇时,就是入环点啦,是不是无巧不成书呀,哈哈哈。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/23744.html

完整代码如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/23744.html

public class Solution {
    public ListNode detectCycle(ListNode head) {
        if(head ==null){
            return null;
        }
        ListNode fast = head;
        ListNode slow = head;
        while(fast!=null&&fast.next!=null){
            fast = fast.next.next;
            slow = slow.next;
            //快慢指针相等表示有环
            if(slow==fast){
               //回到起点一起相同速度走
               while(head!=fast){
                   head = head.next;
                   fast = fast.next;
               }
               return head;
            }

        }
        return null;
    }
}
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/23744.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/suanfa/23744.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定