1. 题目描述
给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
2. 示例
示例 1:
输入:head = [1,2,2,1]
输出:true
示例 2:
输入:head = [1,2]
输出:false
提示:
-
链表中节点数目在范围[1, 105] 内
-
0 <= Node.val <= 9
-
进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/palindrome-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
3. 思路
思路1:将链表值获取后填入数组中,然后循环数组对比前后的值。
思路2:用快慢指针,慢指针每次走一步,快指针每次走两步,
- 双数节点时,慢指针在前半部分最后一个时,快指针在链表尾部。
- 单数节点时,慢指针在中间节点时,快指针已为
nil
。
4. 遇上的问题
在思路2时,知道使用快慢指针找中点,但是不知道反转后链表的指针然后和head做比较
5. 具体实现代码
自己写的代码
6. 官方题解
func isPalindrome(head *ListNode) bool {
if head == nil || head.Next == nil {
return true
}
slow, fast := head, head
var prev *ListNode = nil
for fast != nil && fast.Next != nil {
prev = slow
slow = slow.Next
fast = fast.Next.Next
}
prev.Next = nil // 断开
// 翻转
var head2 *ListNode = nil
for slow != nil {
tmp := slow.Next
slow.Next = head2
head2 = slow
slow = tmp
}
// 比对
for head != nil && head2 != nil {
if head.Val != head2.Val {
return false
}
head = head.Next
head2 = head2.Next
}
return true
作者:xiao_ben_zhu
链接:https://leetcode.cn/problems/palindrome-linked-list/solution/shou-hua-tu-jie-hui-wen-lian-biao-kuai-man-zhi-zhe/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
666
7 题目来源
~~ 加油 ~~ ------swrici