<回文判断><快慢指针-链表中点>
题目
请判断一个链表是否为回文链表。
示例 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步,一步一步走刚好走到中点。