码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2021-04-10 12:49:23      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:lazy   loading   break   相同   int   开始   efi   linked   时移   

技术图片

  • 直接遍历链表,使用set做标记位(标记是否已经到达过)
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
type void struct{}
func detectCycle(head *ListNode) *ListNode {
    if head==nil||head.Next==nil{
        return nil
    }
    
    var nodes = map[*ListNode]void{}
    for head!=nil{
        if _, ok := nodes[head];ok{
            return head
        }
        nodes[head] = void{}
        head = head.Next
    }
    
    return nil
}
  • 快慢指针
    • 先用快慢指针判断是否存在环,
    • 然后将满指针移动到head,
    • 然后以相同的速度同时移动快慢指针,相遇点即为环入口
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func detectCycle(head *ListNode) *ListNode {
    if head==nil||head.Next==nil{
        return nil
    }

    var flag = false//是否存在环
    var slow = head
    var quick = head

    for quick!=nil && quick.Next!=nil{
        slow = slow.Next
        quick = quick.Next.Next
        if quick==slow{
            flag = true
            break
        }     
    }

    if flag{
        slow = head
        for slow!=quick{
            slow = slow.Next
            quick = quick.Next
        }
        return slow
    }

    return nil

}

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

标签:lazy   loading   break   相同   int   开始   efi   linked   时移   

原文地址:https://www.cnblogs.com/pangqianjin/p/14636610.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!