234.回文链表

234.回文链表

1.题目

在这里插入图片描述

2.我的解决方案

想不出来空间复杂度为 O ( 1 ) 的 情 况 O(1)的情况 O(1)

3.官方的解决方案

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def isPalindrome(self, head: ListNode) -> bool:
        # 想不到空间复杂度为常数级的情况
        # 使用双指针法:将链表的后半部分进行反转
        
        # 1.避免空链表
        if not head:
            return True

        # 2.使用快慢指针法找到链表的中间部分
        slow = head
        fast = head
        while fast.next and fast.next.next: # 注意合适的判定条件,让slow处于中间的结点
            slow = slow.next    # 步长为1
            fast = fast.next.next   # 步长为2
        # 当循环停止时,slow处于链表中间位置,fast在链表尾部
        # 为了统计奇数和偶数的操作,将slow对应结点后面的第一个结点作为后半段开始

        # 3. 从slow开始将链表反转
        pre = None
        cur = slow.next
        slow.next = None # 从中间部分断开
        while cur:
            next_node = cur.next # 保存下一个结点位置
            cur.next = pre # 反转
            pre = cur # 前指针移动
            cur = next_node # cur移动
        
        cur1 = head
        cur2 = pre # 后半段头节点应该是pre
        # 4.比较回文
        while cur1 and cur2:
            if cur1.val != cur2.val:
                return False
            cur1 = cur1.next
            cur2 = cur2.next
        return True
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值