暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

golang刷leetcode 链表(5)环形链表

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

为了表示给定链表中的环,我们使用整数 pos
 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos
 是 -1
,则在该链表中没有环。

说明:不允许修改给定的链表。

 

示例 1:

输入:head = [3,2,0,-4], pos = 1
输出:tail connects to node index 1
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

输入:head = [1,2], pos = 0
输出:tail connects to node index 0
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

输入:head = [1], pos = -1
输出:no cycle
解释:链表中没有环。

解题思路:

1,首先用快慢指针判断是否有环

2,假设快慢指针相遇的位置为环起点m后第p个位置,环剩余q个位置

则:

A,m+p=2*(m+p)-k*(p+q)        k为整数,跟m长度与环大小比有关

B,假设k=1 则,m=q

C,m=k*(p+q)-p=(k-1)*(p+q)+q   

3,由此可知,如果慢指针从相遇位置开始,新指针从头开始,则相遇位置一定为环起点

    /**
    * Definition for singly-linked list.
    * type ListNode struct {
    * Val int
    * Next *ListNode
    * }
    */
    func detectCycle(head *ListNode) *ListNode {
    fast:=head
    slow:=head
    flag:=false
    for fast!=nil && fast.Next!=nil{
    fast=fast.Next.Next
    slow=slow.Next
    if fast!=nil && slow==fast{
    flag=true
    break
    }
    }
    if !flag{
    return nil
    }
    fast=head
    for fast!=slow{
    fast=fast.Next
    slow=slow.Next
    }
    return fast
    }


    文章转载自golang算法架构leetcode技术php,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论