刷题使我快乐,满脸开心.jpg
- 来源:力扣(LeetCode)
- 链接:https://leetcode.cn/problems/palindrome-linked-list/
- 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目
给你一个单链表的头节点 head
,请你判断该链表是否为回文链表。如果是,返回 true
;否则,返回 false
。
示例 1:
输入:head = [1,2,2,1]
输出:true
示例 2:
输入:head = [1,2]
输出:false
提示:
- 链表中节点数目在范围
[1, 105]
内 0 <= Node.val <= 9
进阶:你能否用
O(n)
时间复杂度和O(1)
空间复杂度解决此题?
思路
思路还是比较简单的
如果要求空间复杂度时,那么我们就是需要通过反转的手段才能够用
O(n)
复杂度完成比对
而且我们知道,找中点、反转这两个操作都是可以O(n)
复杂度内完成的
没太多要说的,上代码
代码
func isPalindrome(head *ListNode) bool {
// 找中点
fast, slow := head, head
for fast != nil && fast.Next != nil {
fast = fast.Next.Next
slow = slow.Next
}
// 反转后半部分
cur := slow
var prev *ListNode
for cur != nil {
tmp := cur.Next
cur.Next = prev
prev = cur
cur = tmp
}
// 比较两部分是否相同
for head != nil && prev != nil {
if head.Val != prev.Val {
return false
}
head = head.Next
prev = prev.Next
}
return true
}