leetcode算法

Posted Adding

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode算法相关的知识,希望对你有一定的参考价值。

Given a linked list, return the node where the cycle begins. If there is no cycle, returnnull.

Follow up:
Can you solve it without using extra space?

解题思想:

用两个指针来操作本题,一个慢指针slow,一个快指针fast,慢指针一下走一步,慢指针一下走两不,如果不含环,那么当快指针到尾部的时候 return null,如果有环,那么一定存在一点 使得fast=slow.

我在网上找了一个图:Y表示入口,a表示起始点到Y的距离,Z表示相遇点,b表示入口到相遇点的距离, c表示Z跑到Y的距离。 因为有 快指针每次走两步,慢指针每次走一步,推得 2(a+b)=kn+a+b,

化简,  a=kn-b,我们观察这表示什么意思了,就是从X->Y 就相当与  另外一个指针转了n个圈,然后减去b的距离 也就是到达了位置Y。所以最终会在Y相遇。

问题代码(这个代码没有通过leetcode所有测试用例,实在不知道为什么,大神们指导指导下):

  public ListNode detectCycle(ListNode head) {
        if(head==null||head.next==null)return null;
        ListNode fast=head;
        ListNode slow=head;
        while(fast!=null&&fast.next!=null){
            slow=slow.next;
            fast=fast.next.next;
            if(fast==null){//判定fast有没有到达结尾。
                return null;
            }
            if(fast==slow){
                break;
            }
        }
        slow=head;
        while(fast!=slow){
            slow=slow.next;
            fast=fast.next;
        }
        return slow;
        
    }
View Code

全部通过代码:

   public ListNode detectCycle(ListNode head) {
        if(head==null||head.next==null)return null;
        ListNode fast=head;
        ListNode slow=head;
        while(fast!=null&&fast.next!=null){
            slow=slow.next;
            fast=fast.next.next;
            if(fast==null){//判定fast有没有到达结尾。
                return null;
            }
            if(fast==slow){
                slow=head;
                while(fast!=slow){
                    slow=slow.next;
                    fast=fast.next;
                }
                return slow;
            }
        }
        return null;
    }

 

以上是关于leetcode算法的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode(算法)- 343. 整数拆分

以下代码片段的算法复杂度

有人可以解释啥是 SVN 平分算法吗?理论上和通过代码片段[重复]

片段(Java) | 机试题+算法思路+考点+代码解析 2023

leetcode_1292. Maximum Side Length of a Square with Sum Less than or Equal to Threshold_[二维前缀和](代码片段

Leetcode刷题Python LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色