文章目录
q141环形链表
题目传送门
题解
该题目可以使用hash表,但是快慢指针解法更优。
快指针的速度是慢指针的两倍,如果快慢指针进入环形链表中,那么快慢指针必定会重合。如果快指针指向nil,表示到了链表尾,不存在环形。
func hasCycle(head *ListNode) bool {
if head == nil || head.Next == nil {
return false
}
slow, fast := head, head.Next
for slow != fast {
if fast == nil || fast.Next == nil {
return false
}
slow = slow.Next
fast = fast.Next.Next
}
return true
}
q202快乐数
题目传送门
题解
采用快慢指针的解法,和上一题(环形链表)的解法一样。
func isHappy(n int) bool {
if n < 2 {
return true
}
slow, fast := n, sumOfSquares(n)
for slow != fast {
if sumOfSquares(fast) == 1 {
return true
}
slow = sumOfSquares(slow)
fast = sumOfSquares(sumOfSquares(fast))
}
return false
}
func sumOfSquares(num int) (sum int) {
for num != 0 {
sum += (num % 10) * (num % 10)
num /= 10
}
return sum
}
q876链表的中间节点
题目传送门
题解
快指针的速度是慢指针的两倍,快指针到达链表尾时,慢指针刚好到达链表的中间节点。
func middleNode(head *ListNode) *ListNode {
slow, fast := head, head
for fast != nil && fast.Next != nil {
slow = slow.Next
fast = fast.Next.Next
}
return slow
}