当前位置 博文首页 > Sloane的博客:Leetcode 234. 回文链表

    Sloane的博客:Leetcode 234. 回文链表

    作者:[db:作者] 时间:2021-08-14 21:07

    思路:

    题目要求算法时间复杂度为O(n),空间复杂度O(1),采用列表存储节点值的方法不满足要求,因此提出反转链表前一半,与后一半比较的方法。

    a,b一快一慢两个指针,可以很容易得到链表中间节点的位置(奇偶情况略有不同,因此用一个变量计数链表长度);并且在慢指针a遍历列表的同时将前一半链表进行翻转,然后比较反转后的链表与前一半链表是否相同

    获取链表长度是为了判别后一半链表开始的起始位置,若为奇数,需要取a的下一个节点开始

    # Definition for singly-linked list.
    # class ListNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    class Solution(object):
        def isPalindrome(self, head):
            """
            :type head: ListNode
            :rtype: bool
            """
            a = head
            b = head
            newh = None
            lth = 0
            while b:
                b = b.next
                lth += 1
                if b == None:
                    break
                else:
                    b = b.next
                    lth += 1   
                tmp = a.next
                a.next = newh
                newh = a
                a = tmp
            if lth%2 == 1:
                a = a.next
            while newh:
                if newh.val != a.val:
                    return False
                newh = newh.next
                a = a.next
            return True

    ?

    cs