给你一个单链表的头节点 head
,请你判断该链表是否为回文链表。如果是,返回 true
;否则,返回 false
。
拿到这个题的第一念头,就是将链表数据copy到数组中,根据下标判断这个数组是否是回文,进而得到链表的结果。这个方法很简单,我专门看了下本地的挑战点,是说时间复杂度o(n),空间复杂度o(1),那这样怎么计算呢,不管我是重建数组还是重建链表,都需要空间。然后我就考虑申请两个变量,count计数变量、newHead空头指针,
1、遍历链表,获取链表长度count
2、遍历链表,访问到中间位置
3、开始翻转后半部分链表
4、比较两个链表,不等,直接返回false,最终返回true,上代码
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func isPalindrome(head *ListNode) bool {
if head == nil{
return false
}
p := head
count := 0
for p != nil{
count++
p = p.Next
}
p = head
for i:=0;i< count/2;i++{
p = p.Next
}
newHead := new(ListNode)
for p != nil{
t := p
p = p.Next
t.Next = newHead.Next
newHead.Next = t
}
p = head
q := newHead.Next
for p != nil && q != nil{
if p.Val != q.Val{
return false
}
p = p.Next
q = q.Next
}
return true
}
一次通过,但是效率仿佛没有那么高,我看了官方的解法,思路类似,但代码未细看