当前位置: 首页 > article >正文

leetcode_链表 234.回文链表

234.回文链表

  • 给你一个单链表的头节点head,请你判断该链表是否为回文链表。如果是, 返回 true ; 否则, 返回false。
  • 思路:
    1. 找到中间节点(快慢指针法)
    2. 反转后半部分的链表
    3. 比较前半部分和后半部分链表
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution(object):
    def isPalindrome(self, head):
        """
        :type head: Optional[ListNode]
        :rtype: bool
        """
        if not head or not head.next:
            return True  # 如果链表为空或只有一个节点,直接返回 True

        # 1: 找到链表的中点(快慢指针)
        slow, fast = head, head
        while fast and fast.next:
            slow = slow.next
            fast = fast.next.next

        # 2: 反转后半部分链表
        prev = None
        while slow:
            next_node = slow.next
            slow.next = prev
            prev = slow
            slow = next_node

        # 3: 比较前半部分和后半部分的值
        left, right = head, prev  
        # prev 是后半部分链表的头
        while right:  
        # 只需要比较右半部分
            if left.val != right.val:
                return False
            left = left.next
            right = right.next

        return True
  • 时间复杂度:O(n),其中 n 是链表的长度,总共遍历了三遍链表,n+n+n = 3n,时间复杂度忽略常数级故为O(n)
  • 空间复杂度:O(1)

http://www.kler.cn/a/524135.html

相关文章:

  • 2007-2020年各省国内专利申请授权量数据
  • 高级编码参数
  • 51单片机开发:定时器中断
  • 使用 KNN 搜索和 CLIP 嵌入构建多模态图像检索系统
  • 面试经典150题——图
  • 马尔科夫模型和隐马尔科夫模型区别
  • docker commit命令解析(将容器的当前状态保存为一个新的镜像)
  • AI如何革新工程建造物资管理
  • C#操作GIF图片(下)将一帧一帧的图片合并成gif
  • css 实现进度条和数字自增动画效果
  • C++:多继承习题3
  • 力扣【501. 二叉搜索树中的众数】Java题解
  • java.util.Random类(详细案例拆解)(已完结)
  • 面试经典150题——图
  • 宫本茂的游戏设计思想:有趣与风格化
  • FreeRTOS从入门到精通 第十一章(FreeRTOS时间管理)
  • doris:JSON
  • LLM架构与优化:从理论到实践的关键技术
  • [MySQL]事务的理论、属性与常见操作
  • Web实训项目-ToDoSystem项目
  • 区块链在能源行业的应用场景
  • 基于FPGA的BT656解码
  • Elasticsearch+kibana安装(简单易上手)
  • 几种K8s运维管理平台对比说明
  • SQL注入漏洞之 提交方式类型注入 Get分类 Post分类 Cookie分类 请求数据位置分类 请求行 请求头 请求数据分类 靶场练习
  • 【Leetcode刷题记录】45. 跳跃游戏 II--贪心算法