給定一個有環鏈表,實現一個算法返回環路的開頭節點。
有環鏈表的定義:在鏈表中某個節點的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
}