234. 回文链表
请判断一个链表是否为回文链表
菜鸡只会快慢指针,递归是真的难,搞不懂
也可以创建一个数组,把链表中的值放进数组,然后就好做了,只不过由于创建了一个包含所有链表值的数组,空间复杂度就变味了O(n)
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def isPalindrome(self, head: ListNode) -> bool:
if head == None:
return(True)
fast, slow = head, head
while fast.next and fast.next.next:#注意这个判定条件
fast = fast.next.next
slow = slow.next
#通过上面的得到了指向中点的slow指针,下面就是通过slow反转链表了
cur = slow.next
pre = None
while cur:
tem = cur.next
cur.next = pre
pre = cur
cur = tem
#返回的pre就是反转后的链表,只需要逐个判定对应节点的值是否相等就行
while pre:
if pre.val != head.val:
return(False)
else:
pre = pre.next
head = head.next
return(True)
时间复杂度:寻找中间节点O(n/2),反转链表O(n/2),判断反转链表和原链表对应位置的值是否相等O(n/2),所以最后总的时间复杂度O(n)
空间复杂度:由于只是临时创建了几个指针,所以空间复杂度O(1)