1.141. 环形链表
https://leetcode-cn.com/problems/linked-list-cycle/
https://leetcode-cn.com/problems/linked-list-cycle/submissions/
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
/*
方法一:快慢指针(12ms)
快指针一次走两步,慢指针一次走一步,如果链表有环,那么两个指针始终会相遇。
时间复杂度 O(n),空间复杂度 O(1)
*/
func hasCycle(head *ListNode) bool {
fast, slow := head, head
for fast != nil && slow != nil && fast.Next != nil{
fast = fast.Next.Next
slow = slow.Next
if fast == slow {
return true
}
}
return false
}
/*
方法二:hash表(8ms)
将遍历过的节点记录下来,如果又遍历到了,表示链表有环,
时间复杂度O(n),空间复杂度O(n)
*/
func hasCycle(head *ListNode) bool {
if head == nil || head.Next == nil {
return false
}
hash := make(map[*ListNode]int)
for head != nil{
if _, found := hash[head]; found{
return true
}
hash[head]= head.Val
head = head.Next
}
return false
}
/*
方法三:走自己的路让别人无路可走思路(8ms)
在评论区看到的代码,表示差点被笑死。
将遍历过的节点值修改为一个后台不太可能设置的值,来标志这个节点我们遍历到了。
这个思路虽然有点沙雕,但是一样能达到 O(1) 的空间复杂度,
*/
func hasCycle(head *ListNode) bool {
if head == nil || head.Next == nil {
return false
}
for head != nil{
if head.Val == 12345678{
return true
}
head.Val = 12345678
head = head.Next
}
return false
}