请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
解法一:快慢指针+链表反转
先利用快慢指针找到链表中点O(n)时间,然后反转后半段O(n)时间,最后遍历比较O(n)时间。空间复杂度为O(1)。
class Solution:def isPalindrome(self, head: ListNode) -> bool:p = slow = fast = headwhile fast and fast.next:slow, fast = slow.next, fast.next.nextpre, cur = None, slowwhile cur:nxt = cur.nextcur.next = prepre, cur = cur, nxtq = prewhile p and q:if p.val != q.val:return Falsep, q = p.next, q.nextreturn True
解法二:递归
利用递归反向遍历链表(有点类似二叉树的后序遍历)。这个方法用到递归外的变量来从head迭代整个链表,真是一个神奇的方法!虽然不符合空间O(1)的要求,但是这个解法值得记忆。
class Solution:def isPalindrome(self, head: ListNode) -> bool:self.front = headdef recursive(cur) -> bool:if not cur:return Trueif not recursive(cur.next):return Falseif self.front.val != cur.val:return Falseself.front = self.front.nextreturn Truereturn recursive(head)
