• 链表中环的入口结点


    题目描述

    给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

    思路

    快慢指针。
    快指针步长2,慢指针步长1。如果存在环,快指针总能追上慢指针。
    先找到快慢指针相遇的点p,并假设环的入口在点q。
    从头节点到点q距离为A,q->p距离为B,p->q距离为C。
    因为快指针是慢指针的两倍速,且在p点相遇,则可以得到等式 2(A+B) = A+B+C+B.
    由等式可得,C = A。
    此时slow指针已经在p,可以让fast返回头节点以步长1开始走,原slow指针继续保持原来的走法。
    fast与slow再次相遇时,因为A=C,所以相遇的点一定是q。
    

    时间复杂度O(n),空间复杂度O(1)。

    代码

    /*
     public class ListNode {
        int val;
        ListNode next = null;
    
        ListNode(int val) {
            this.val = val;
        }
    }
    */
    public class Solution {
        public ListNode EntryNodeOfLoop(ListNode pHead) {
            ListNode slow = pHead;
            ListNode fast = pHead;
            while(fast != null) {
                if(fast.next == null) {
                    return null;
                }
                slow = slow.next;
                fast = fast.next.next;
                if(slow == fast) {
                    fast = pHead;
                    while(fast != slow) {
                        fast = fast.next;
                        slow = slow.next;
                    }
                    return slow;
                }
            }
            return null;
        }
    }
    

    笔记

    除了相遇,其余情况都返回null。

  • 相关阅读:
    三、ADO.Net基础【04】简单查询
    Canvas 图片绕边旋转的小动画
    Canvas 剪切图片
    Canvas 图片平铺设置
    Canvas 给图形绘制阴影
    Canvas 图形组合方式
    [转]JS获取URL传参方法
    HTML5 FileReader接口学习笔记
    css3实现圆角边框渐变
    HTML5新增属性学习笔记
  • 原文地址:https://www.cnblogs.com/ustca/p/12395491.html
Copyright © 2020-2023  润新知