刷題--程序員面試金典--面試題 02.08. 環路檢測(go)

面試題 02.08. 環路檢測

給定一個有環鏈表,實現一個算法返回環路的開頭節點。
有環鏈表的定義:在鏈表中某個節點的next元素指向在它前面出現過的節點,則表明該鏈表存在環路。


示例 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
解釋:鏈表中沒有環。

進階:
你是否可以不用額外空間解決此題?

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/linked-list-cycle-lcci
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。


快慢指針,不利用額外空間:

func detectCycle(head *ListNode) *ListNode {
    if head == nil {
        return nil
    }
    if head.Next == head {
        return head
    }
    fir,sec := head,head
    flag := false

    for fir != nil && fir.Next != nil {
        fir = fir.Next.Next
        sec = sec.Next
        if fir == sec {
            flag = true
            break
        }
    }

    fir = head
    if flag {
        for fir != sec {
            sec = sec.Next
            fir = fir.Next
        }
        return fir
    }

    return nil
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章