0
点赞
收藏
分享

微信扫一扫

Leetcode-快慢指针遍历

认真的老去 2022-01-20 阅读 38
leetcode

文章目录


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
}

举报

相关推荐

0 条评论