时间复杂度:O(n),空间复杂度:O(1)
解题思路
既然要判断回文,那肯定就要将链表从后向前遍历,所以就会想到反转链表。
但是反转的不是整个链表,而是链表的后半部分,反转后就可以用两个指针同步遍历判断是否回文啦。
但问题又来了,如何找到链表后半部分的头节点或该链表的中间节点呢?很简单,用快慢指针就可以找到,慢指针每次走一步,快指针每次走两步,这样当快指针为nil时慢指针的节点就是链表后半部分的头节点。
AC代码
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func isPalindrome(head *ListNode) bool {
slow,fast:=head,head
for fast!=nil&&fast.Next!=nil{
slow=slow.Next
fast=fast.Next.Next
}
slow=reverse(slow)
for head!=nil&&slow!=nil{
if head.Val!=slow.Val{
return false
}
head=head.Next
slow=slow.Next
}
return true
}
func reverse(head *ListNode)*ListNode{
var pre *ListNode
for head!=nil{
next:=head.Next
head.Next=pre
pre=head
head=next
}
return pre
}
感悟
刚好做完反转链表题目后做的这题,很快地写出了反转代码。