时间复杂度:O(n)
解题思路
链表题看见有要求时间复杂度为O(n),必须想到双指针。
让慢指针一次遍历一个结点,而快指针一次遍历两个结点,这样两个指针就会产生速度差。
如果链表中有环,那么二者一定会相遇的,具体证明参考算法导论。
AC代码
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func hasCycle(head *ListNode) bool {
slow,fast:=head,head
for fast!=nil&&fast.Next!=nil{
slow=slow.Next
fast=fast.Next.Next
if slow==fast{
return true
}
}
return false
}
感悟
如果仅仅是判断是否是环形链表还是很简单的,用快慢指针就可以解决。但如果要是求链表尾指向的那个结点是第几个结点就有点难度了。
二刷感悟
很顺利地写了出来,但是for循环条件没写好,把fast.Next!=nil的判断放在了循环里,导致效率降低,改到for循环条件中后时间效率提升,并且代码变得更简洁。