golang中怎么利用leetcode实现一个环形链表

发布时间:2021-07-06 15:14:15 作者:Leah
来源:亿速云 阅读:158

golang中怎么利用leetcode实现一个环形链表,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

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

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

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

示例 1:

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

golang中怎么利用leetcode实现一个环形链表

示例 2:

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

golang中怎么利用leetcode实现一个环形链表

示例 3:

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

golang中怎么利用leetcode实现一个环形链表

解题思路:

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}

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

推荐阅读:
  1. java如何实现环形链表?
  2. 怎么在golang中实现一个环形队列

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

golang leetcode

上一篇:golang中怎么利用channel 实现一个连接池

下一篇:golang中怎么利用leetcode 删除链表重复元素

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》