题目
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
解题思路
这个题虽然知道肯定是要反转链表,但是一直不知道怎么在空间复杂度为1的情况下做到,应该说不知道怎么找到中间点,然后看了别人的解题思路才意识到快慢指针的用法。
快指针每次移动2格,慢指针每次移动一格,当快指针无法移动的时候,慢指针就到了中间点了。
然后慢指针开始反转链表,完成以后就可以开始遍历了
每次从慢指针完成后的结点拿出一个元素、从头结点拿出一个元素,如果相等就移动指针,否则返回False
遍历完成以后,就可以返回True
答案(一)
class Solution:
def isPalindrome(self, head: ListNode) -> bool:
fast = head
slow = head
while fast:
fast = fast.next.next if fast.next else fast.next
slow = slow.next
p = None
c = slow
while c:
t = c.next
c.next = p
p = c
c = t
while p:
if p.val == head.val:
p = p.next
head = head.next
else:
return False
return True