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);
    }
};

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • C语言int的取值范围_c语言int表示范围

    C语言int的取值范围_c语言int表示范围C语言int的取值范围我们常常看到int取值范围为-32768~32767,实际上int的取值范围依赖于计算机系统,在16位机器中,int占16位,取值范围为前面所说的-32768~32767(-2^16~2^16-1)。而在32位和64位机器中,int占32位,取值范围为-2147483648~2147483647(-2^32~2^32-1)。ISO/ANSIC规定,int类型的最小范围为……

  • 堆和栈的区别(队列和栈的区别)

    堆(Heap)与栈(Stack)是开发人员必须面对的两个概念,在理解这两个概念时,需要放到具体的场景下,因为不同场景下,堆与栈代表不同的含义。一般情况下,有两层含义:(1)程序内存布局场景下,堆与栈表示的是两种程序内存分区;(2)数据结构场景下,堆与栈表示两种常用的数据结构。1.程序内存分区——堆与栈栈由操作系统自动分配释放,用于存放函数的参数值、局部变量的值等,其操作方式类…

  • 【转载】啥,又要为表增加一列属性?

    【转载】啥,又要为表增加一列属性?

    2021年11月20日
  • pycharm怎么设置代码补全_vs2010代码自动补全

    pycharm怎么设置代码补全_vs2010代码自动补全代码补全功能在PyCharm上是一流的。默认情况下PyCharm会在你输入的时候给出建议:由于此功能可有点耗电,你可以通过选择File→PowerSaveMode来禁用它。您仍然可以通过Control-Space显式使用这一功能。…

  • 网站测速源码_域名检测工具

    网站测速源码_域名检测工具简介:网址发布页模板,带网址测和域名检测功能,虽然是假的,但是也很有逼格。网盘下载地址:http://kekewl.net/D0Ef4yBuoyy0图片:

  • fgc java,频繁FGC的真凶原来是它

    fgc java,频繁FGC的真凶原来是它频繁FGC的真凶原来是它上周排查了一个线上问题,主要现象是CPU占用过高,jvmold区占用过高,同时频繁fgc,我简单排查了下就草草收场了,但是过后我对这个问题又进行了复查,发现问题没有那么简单,下面跟着我一起分析一下到底是怎么回事?复查过程复查原因事后再看dump文件注意到最大的对象是一个ArrayList,里面几乎都是ElasticSearchStatusException对象可是发生…

发表回复

您的电子邮箱地址不会被公开。

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