zoukankan      html  css  js  c++  java
  • 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步,一步一步走刚好走到中点。

  • 相关阅读:
    对两个有序数组进行合并
    连续子数组的最大和问题
    设计模式的学习
    Android基础总结(12)——XML和JSON解析
    Android基础总结(8)——服务
    x64 Assembly Tutorial 1 : Getting into x64 ASM from C++
    C# IL 指令集
    Unity3D教程宝典之地形
    Unity3D 动态改变地形 Unity3D Dynamic Change Terrain
    C#中String.format用法详解
  • 原文地址:https://www.cnblogs.com/remly/p/11454661.html
Copyright © 2011-2022 走看看