[Go版]算法通关村第一关白银——判断是否回文链表

2023-10-30

题目:判断是否是回文链表

题目链接:LeetCode-234. 回文链表
在这里插入图片描述

解决方法:快慢指针+递归反转链表

思路分析

  1. 使用快慢指针,当快指针到达结尾停下时,慢指针正好在中间(注意:奇数链表时,慢指针在正中间;偶数链表时,慢指针在中间的下一位)
  2. 然后反转此时的慢指针链表(比如:1->2->3->2->1,反转3->2->1,得到1(注意这个1是原链表的尾节点指针)->2->3)
  3. 最后循环反转后的链表和原链表,依次取出首节点对比,值不等说明不是回文序列,直达循环结束,结束条件是反转链表遍历完,如果到结束都是相等的,说明就是回文序列

复杂度:时间复杂度: O ( n ) O(n) O(n)、空间复杂度: O ( 1 ) O(1) O(1)

  • 时间复杂度: O ( n ) O(n) O(n)

    isPalindrome 函数的时间复杂度是 O ( n ) O(n) O(n),其中 n 是输入链表中节点的个数。这是因为该函数首先使用快慢指针技巧找到链表的中间节点,这需要 O ( n / 2 ) O(n/2) O(n/2) 的时间。然后,它递归地反转链表的后半部分,这也需要 O ( n / 2 ) O(n/2) O(n/2) 的时间。最后,它比较原始链表和反转链表中每个节点的值,这需要 O ( n ) O(n) O(n) 的时间。总的时间复杂度为 O ( n / 2 ) O(n/2) O(n/2)+ O ( n / 2 ) O(n/2) O(n/2)+ O ( n ) O(n) O(n)= O ( n ) O(n) O(n)

  • 空间复杂度: O ( 1 ) O(1) O(1)

    isPalindrome 函数的空间复杂度是 O ( 1 ) O(1) O(1),因为它仅使用常量级别的额外空间来存储变量和指针,与输入链表的大小无关。递归的 reverselist 函数在进行递归过程中只存储临时变量,不使用与输入规模成比例的额外数据结构。因此,空间复杂度为 O ( 1 ) O(1) O(1)

Go代码

import (
    "fmt"
)
type ListNode struct {
	Val int
	Next *ListNode
}
func reverselist(head *ListNode) *ListNode {
    fmt.Println("reverse:", head.Val)
    if head == nil || head.Next == nil {
        return head
    }
    tmp := head
    newHead := reverselist(tmp.Next)
    tmp.Next.Next = tmp
    tmp.Next = nil
    return newHead
}
func isPalindrome(head *ListNode) bool {
    if head == nil {
        return false
    }
    if head.Next == nil {
        return true
    }
    slow := head
    fast := head
    var newList *ListNode
    for {
        if fast == nil || fast.Next == nil{
            break
        }
        slow = slow.Next
        fast = fast.Next.Next
    }
    newList = reverselist(slow)
    isSame := true
    for {
        if newList == nil || head == nil {
            break
        }
        if newList.Val != head.Val {
            isSame = false
            break
        }
        newList = newList.Next
        head = head.Next
    }
    return isSame
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[Go版]算法通关村第一关白银——判断是否回文链表 的相关文章

随机推荐

  • opengl测试操作

    深度测试 深度缓冲 Depth Buffer 来防止被阻挡的面渲染到其它面的前面 在这一节中 我们将会更加深入地讨论这些储存在深度缓冲 或z缓冲 z buffer 中的深度值 Depth Value 以及它们是如何确定一个片段是处于其它片段
  • CoordinatorLayout+ToolbarLayout+Behavior实现动态搜索框

    文章目录 最终效果图 参照京东 1 实现思路 2 具体流程 3 问题解决 项目地址 最终效果图 参照京东 1 实现思路 CoordinatorLayout中可以用Behavior实现特定的布局位置和滑动效果 我们使用Behavior来控制搜
  • DataSourceBuilder.create().build()

    Spring Boot also provides a utility builder class DataSourceBuilder that can be used to create one of the standard data
  • 【MQTT】MQTT实现订阅发送demo

    Mqtt简单实现发送消息 订阅消息 系列文章目录 目录 Mqtt简单实现发送消息 订阅消息 系列文章目录 安装好Mosquitto maven引入依赖 创建发布客户端 PublishClient java 创建订阅客户端 Subscribe
  • 计算机网络(16)-计算机网络应用示例

    目录 一 音频视频传输 二 语音电话的流量控制 服务质量QoS 1 数据分组标记优先级 2 路由器流量管制 3 路由器调度机制分配带宽 4 呼叫接纳 三 无线网络 无线局域网的组成 1 有固定基础设施的无线局域网 2 移动自组网络 一 音频
  • LaTex中把下标置于文本正下方的方法 (转载)

    转载一篇文章 因为我想打出 H z H 0 J m
  • Everything下载及使用教程【非常详细】(磁盘文件搜索神器)

    下载地址https www voidtools com zh cn 下载完以后双击exe安装 选择简体中文 点击ok 点击我接受 选择安装目录 点击下一步 保存设置和数据到文件夹 选择安装到文件夹 NTFS索引 选择安装Everything
  • android中的Package替换流程

    android系统在安装 删除 替换 清除数据等与应用相关的动作时 会发出对应的Broadcast 上层的应用通过注册相应的广播事件来做相应的处理 1 ACTION PACKAGE ADDED 当有新的包安装成功的时候 系统会发出此广播 2
  • python web.py启动https端口

    web py启动https端口需要ssl证书 如果没有ssl证书 那么可以通过如下方式生成 具体可参考 https blog csdn net FinalDragonborn article details 79301026 openssl
  • QT之QComboBox使用汇总

    简介 QComboBox是一个集按钮和下拉选项于一体的控件 也被称为下拉列表框 addItem 函数添加一个列表项 ui gt comboBox gt clear 清除列表 for int i 0 i lt 20 i QIcon icon
  • 上传图片返回url java_Java实现图片上传返回上传地址

    关于在实际开发中最常用也是用的最多的Java实现文档 图片上传 一 准备阶段 文档 图片上传有几种方式 包括传统的ajax上传 云上传 这里给大家实现通过代码将图片上传至七牛云服务器并返回图片地址 1 需申请一台七牛云服务器地址 可免费试用
  • MacBook 配置 item2 、oh-my-zsh、Powerline

    MacBook 配置 item2 oh my zsh Powerline item2安装 oh my zsh 强烈推荐使用Git方式获取 简单上手 Powerline 强烈推荐使用Git方式获取 简单上手 最后效果图 item2安装 链接
  • Leetcode:28. Implement strStr() —— KMP算法

    Implement strStr Return the index of the first occurrence of needle in haystack or 1 if needle is not part of haystack E
  • tts服务器最基本维护方法,关于服务器维护的方法和技巧_

    关于服务器维护的方法和技巧 服务器出现故障的几率是非常的少的 但是仍然是需要引起高度性的重视的 因为这种类型的产品是非常重要的 大家都知道 尤其是对于整个网站是具有非常重要的意义 所以是需要时刻的关注产品 是不是出现一些问题 要避免损坏 在
  • VSCode 之 设置 settings.json 配置文件

    这篇文章主要介绍了 VSCode settings json 配置 文中通过示例代码介绍的非常详细 对大家的学习或者工作具有一定的参考学习价值 VSCode 从插件库里安装 eslint 和 prettier 两个 插件 也 实现 自动 格
  • 切比雪夫不等式例题讲解_一些不等式的杂货

    本文主要针对高考生和竞赛新手 东西比较杂 没什么顺序想到哪写哪 不涉及太多额外知识 一 三角里内角的几个不等式 锐角三角形 如果你不知道它们 或许问题不大 如果你不用琴生不会证 我就不知道说啥了 1 固定变量的思想有没有 不等式得证 或者考
  • 入门Docker你不得不读的基础知识

    本期喵锅给大家带来关于Docker研究及实际工作过程中的知识经验分享 内容过于翔实 万字长文 还请耐心阅读哦 不足之处还望小伙伴们在下方评论区多多留言 大家共同探讨 共同进步 一 Docker介绍 先讲问题 什么是docker 为什么用do
  • 解决recycleView加载九宫格由于图片过大导致卡顿的问题

    最近在开发公司项目的时候 遇到了很棘手的问题就是后台返回的图片很大 导致加载的很慢 当时考虑用压缩 但是压缩考虑到性能不好 所以就常识了新的解决办法代码如下 public class NineGridImageView extends Vi
  • UE4 SpawnActor

    UPROPERTY EditDefaultsOnly Category Player TSubclassOf
  • [Go版]算法通关村第一关白银——判断是否回文链表

    目录 题目 判断是否是回文链表 解决方法 快慢指针 递归反转链表 思路分析 复杂度 时间复杂度 O n O n