美文网首页
Leetcode系列之链表(2)

Leetcode系列之链表(2)

作者: FisherTige_f2ef | 来源:发表于2019-10-15 15:48 被阅读0次

题目2:

对于一个给定的链表,返回环的入口节点,如果没有环,返回null

  拓展:

  你能给出不利用额外空间的解法么?

思路:

1.判断链表是否有环:如果有环,快慢指针一定会相遇,而且相遇点必然在环内(快慢指针)

2.查找环的入口:(数学模型推理)

由1所知,设计数学模型1如下图(O为快慢指针的起点,E为环的入口点,M表示快慢指针的相遇点)(模型2所有的点都是入口,不需要讨论)

链表的总长度为:OE+n(OE表示线段长度,n表示圆环的长度),当OE+EM步的慢指针与快指针相遇与M点,快指针已在环内走了k圈

由于快指针永远是慢指针步长的两倍,于是在第一次相遇点有,2(OE+EM)=OE+k*n+EM,求OE得,OE=k*n-EM

也就是说,慢指针从O点出发到E点,快指针从M点顺时针出发走k圈,会相遇于E点(E点就是我们要找的入口)

ps:同向出发切的思维切换到,以慢指针从起点出发,快指针从相遇点开始出发的思维(是不是觉得很熟悉,没错与小学考试的路程相遇点题目很类似!!!)

代码:

/**

* Definition for singly-linked list.

* class ListNode {

*    int val;

*    ListNode next;

*    ListNode(int x) {

*        val = x;

*        next = null;

*    }

* }

*/

public class Solution {

    public ListNode detectCycle(ListNode head) {

        if(head==null||head.next==null){

            return null;

        }

        ListNode fast=head;

        ListNode slow=head;

        while(fast.next!=null&&fast.next.next!=null){

            fast=fast.next.next;

            slow=slow.next;

            if(fast==slow)break;

        }

        if(fast.next==null||fast.next.next==null){

            return null;

        }

        slow=head;

        while(slow!=fast){

            slow=slow.next;

            fast=fast.next;

        }

        return slow;

    }

}

相关文章

  • Leetcode系列之链表(2)

    题目2: 对于一个给定的链表,返回环的入口节点,如果没有环,返回null 拓展: 你能给出不利用额外空间的解法...

  • Swap Nodes in Pairs

    标签: C++ 算法 LeetCode 链表 每日算法——leetcode系列 问题 Swap Nodes in ...

  • Remove Nth Node From End of List

    标签: C++ 算法 LeetCode 链表 每日算法——leetcode系列 问题 Remove Nth Nod...

  • Merge k Sorted Lists

    标签: C++ 算法 LeetCode 链表 每日算法——leetcode系列 问题 Merge Two Sort...

  • 关于链表经典算法题都在这里了

    1.单链表反转(LeetCode 206) 2.链表中环的检测 (LeetCode 141) 3.求链表中环开始结...

  • Leetcode系列之链表(16)

    题目: 有两个大小分别为m和n的有序数组A和B。请找出这两个数组的中位数。你需要给出时间复杂度在O(log (m+...

  • Leetcode系列之链表(14)

    题目: 给定一个链表,删除链表的倒数第n个节点并返回链表的头指针 例如, 给出的链表为:1->2->3->4->5...

  • Leetcode系列之链表(15)

    题目: 给定两个代表非负数的链表,数字在链表中是反向存储的(链表头结点处的数字是个位数,第二个结点上的数字是百位数...

  • Leetcode系列之链表(13)

    题目: 合并k个已排序的链表并将其作为一个已排序的链表返回。分析并描述其复杂度。 思路: 典型的多路归并问题 代码...

  • Leetcode系列之链表(9)

    题目: 将两个有序的链表合并为一个新链表,要求新的链表是通过拼接两个链表的节点来生成的 思路: 普通的排序问题,难...

网友评论

      本文标题:Leetcode系列之链表(2)

      本文链接:https://www.haomeiwen.com/subject/vsusmctx.html