234. 回文链表

<回文判断><快慢指针-链表中点>

题目

请判断一个链表是否为回文链表。

示例 1:

输入: 1->2
输出: false

示例 2:

输入: 1->2->2->1
输出: true

进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

我的思路

 (复杂度奇高。。。)

1.判断回文字符串如何处理长度的一半问题?

for i in range(len(s)//2):
    if s[i] != s[len(s)-i-1]:
        print("false")
不用奇偶判断

奇数的时候,终点刚好落到中间的位置

偶数的时候,终点在中间靠右,首尾的指针到最后应该是这样: start | end  -> end | start。相当于多判断了一次中间的两个数。。

2.更好的回文判断:s=s[::-1]

class Solution(object):
    def isPalindrome(self, head):
        """
                1.把链表存到数组
                2.按照普通方式判回文
        """
        node = head
        tmp =[]
        while node:
            tmp.append(node.val)
            node= node.next
        if len(tmp)==1:return True
        div = int(len(tmp)/2)
                '''
                这里分为奇数数组的折中 和 偶数数组的折中
                是否能优化???
                '''
        if len(tmp)%2:
            left = div+1
            right = div-1
        else:
            left = div
            right=div-1
        if tmp[:left]==tmp[-1:right:-1]:
            return True
        else:
            return False

题解

总结

1.用快慢指针来找链表中点

先定义快指针每次走2步,满指针每次走1步。

想象一个长度为10的链表,快指针走了5步到达终点(None节点)

满指针当然也走了5步,一步一步走刚好走到中点。

原文地址:https://www.cnblogs.com/remly/p/11454661.html