Leetcode 234 Palindrome Linked List 复杂度为时间O(n) 和空间(1)解法[通俗易懂]

Leetcode 234 Palindrome Linked List 复杂度为时间O(n) 和空间(1)解法

大家好,又见面了,我是全栈君。

1. 问题描写叙述

  给定一个单链表,推断其内容是不是回文类型。

比如1–>2–>3–>2–>1。时间和空间复杂都尽量低。


2. 方法与思路

  1)比較朴素的算法。

  因为给定的数据结构是单链表,要訪问链表的尾部元素,必须从头開始遍历。为了方便推断。我们能够申请一个辅助栈结构来存储链表的内容,第一次遍历将链表节点值依次入栈,第二次遍历比較推断是否为回文。

  

/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */
class Solution {
public:
    bool isPalindrome(ListNode* head) {
        if(head == NULL || head->next == NULL) return true;
        stack<int> st;
    ListNode *tmp = head;
        while(tmp)
        {
            st.push(tmp->val);
            tmp = tmp->next;
        }

    while(head)
    {
        if(head->val != st.top() ) return false;
        head = head->next;
        st.pop();
    }
        return true;
    }
};

  2). 时间O(n)和空间O(1)解法
  既然用到了栈,能够想到递归的过程本身就是出入栈的过程,我们能够先递归訪问单链表,然后做比較。这样就省去了辅助空间,从而将空间复杂度降为O(1)。代码例如以下:
  

/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */
class Solution {
private:
    ListNode *lst;
public:
    bool judge(ListNode *head)
    {
        if(head == NULL) return true;

        if(judge(head->next) == false) return false;

        if(lst->val != head->val) return false;
        else{
            lst = lst->next;
            return true;
        }
    }
    bool isPalindrome(ListNode* head) {
        if(head == NULL || head->next == NULL) return true;
        lst = head;

        return judge(head);
    }
};

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115288.html原文链接:https://javaforall.net

(0)
上一篇 2022年2月6日 下午3:00
下一篇 2022年2月6日 下午3:00


相关推荐

  • windows server2016的docker启动iis镜像,并开启iis服务

    windows server2016的docker启动iis镜像,并开启iis服务由于 net 服务需要搭建在 iis 中 因此需要 iis 的镜像容器 然后再把自己的项目程序部署上去 废话不多说 首先 pull 微软的 iis 这个比较大 大约 4G 需要配置加速器 配置方法在我的前一遍文章介绍了 使用命令 dockerpullmi iis 接下来进行启动 iis 看到我们熟悉的 iis 欢迎界面 使用命令 dockerrun d p80 80micro

    2026年3月19日
    2
  • Python sklearn 实现过采样和欠采样

    Python sklearn 实现过采样和欠采样Imblearnpack 准备知识 1CompressedS 压缩稀疏的行 过采样 Over sampling 1 实用性的例子 11 朴素随机过采样 12 从随机过采样到 SMOTE 与 ADASYN 13SMOTE 的变体 14 数学公式 下采样 Under sampling 1 原型生成 prototype

    2026年3月18日
    2
  • Http报头Accept与Content-Type的区别

    Http报头Accept与Content-Type的区别RequestMapping有多个属性来进一步匹配HTTP请求到Controller方法,分别是value,请求的URL的路径,支持也模板、正则表达式method,HTTP请求方法,有GETPOSTPUTconsumes,允许的媒体类型(MediaTypes),如onsumesapplication/ison”,对应于请求的HTTPConten…

    2022年8月24日
    8
  • 【Unity3D基础教程】给初学者看的Unity教程(零):如何学习Unity3D「建议收藏」

    【Unity3D基础教程】给初学者看的Unity教程(零):如何学习Unity3D「建议收藏」作者:王选易,出处:http://www.cnblogs.com/neverdie/欢迎转载,也请保留这段声明。如果你喜欢这篇文章,请点推荐。谢谢!Unity3D有什么优势Unity3D是一个跨

    2022年8月6日
    8
  • css两端对齐

    css两端对齐两端对齐在导航 Nav 的制作中非常常用 例子例如下面这个例子 在导航栏中 我们希望左边的 nav 文字左端对齐 右边的 button 有段对齐 并且导航栏部分居中 和上边 banner 中的文字 以及下边的内容居中对齐 概念 flex 弹性盒模型 flex 作为强大的弹性布局方式 可以 hold 住大部分的布局效果 当然也包括两端对齐 可以使用主轴对齐 justify content 的两端对齐属性 space between display flex 应用 flex 布局 justify content space be

    2026年3月20日
    2
  • java rpc motan_RPC框架motan使用

    java rpc motan_RPC框架motan使用简介 motan 是新浪微博开源的一套轻量级 方便使用的 RPC 框架 HelloWorld 使用的过程分为 Server 端和 Client 端 Server 提供 RCP 的服务接口 Client 端发起调用获取结果 maven 的 pom 文件配置 0 2 1com weibomotan core motan version com weibomotan transport netty motan version com

    2026年3月19日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号