判断链表是否回文,空间复杂度不多于 O(1) 时间复杂度不多于 O(n)

要判断是否是回文链表这本身不难,难就难在对那两个复杂度的要求太恶心了。

我一开始的想法是先找出链表的中点,再向两边遍历,以右结点为空作为循环结束的条件。感觉挺好哈,可是这特么是单向链表。

然后我琢磨像 12321 这样的有一个特点,就是 1 + 3 = 2 + 2 = 3 + 1 觉得我特么简直就是天才,居然发现了这么神奇的数学规律,请叫我 X 欧拉。

直到我发现了 000111 = = -> T-T -> QAQ

最终的解决方法是我看了一些博客之后总结的,就是利用递归不断地向后找,直到找到最后一个结点,然后再往回回溯。

这个技巧很有趣,因为这是迭代很难替换的,因为似乎是用到了递归逆天的求值顺序。我之前想不通的一个点就是,怎样在单项链表里往后遍历如今终于是找到了答案。

好了废话这么多,贴一下代码:

bool innerCheck(ListNode *&it, ListNode *checkNode){
    if (checkNode == nullptr){
        return true;
    }

    if (!innerCheck(it, checkNode->next)){
        return false;
    }

    if (it->val == checkNode->val){
        it = it->next;
        return true;
    }

    return false;
}

bool isPalindrome(ListNode* head) {
    auto it = head;
    return innerCheck(it, head);
}

对了还有一个细节需要注意,那就是第一个参数的类型是 ListNode *& 。对,是一个指针的引用,不然函数体内移动的 it 就不是 it 的本体,而是一个拷贝的指针。

时间: 2024-08-07 11:00:51

判断链表是否回文,空间复杂度不多于 O(1) 时间复杂度不多于 O(n)的相关文章

链表逆序+判断链表是否回文

单链表逆序详解 1.具有链表头的单链表 假设需要逆序的单链表为: 则逆序以后的链表为: 过程: (1)取p1指向header->next (p1=stu->next);p2保留p1->next(p2=p1->next);将p1->next置为NULL,因为单链表逆序以后,当前的p1节点为尾节点 p1->next=NULL; (2)取p3保留p2->next (p3=p2->next);将p2插入p1之前(p2->next = p1);p1指向p2指向的

234. Palindrome Linked List【Easy】【判断链表是否回文】

Given a singly linked list, determine if it is a palindrome. Example 1: Input: 1->2 Output: false Example 2: Input: 1->2->2->1 Output: true Follow up:Could you do it in O(n) time and O(1) space? /** * Definition for singly-linked list. * publi

LeetCode234_PalindromeLinkedList (判断是否为回文链表) Java题解

题目: Given a singly linked list, determine if it is a palindrome. Follow up: Could you do it in O(n) time and O(1) space? 题解: 判断一个链表是不是回文的,这里要求O(n)时间复杂度和O(1)的空间时间复杂度,总共想了三种办法,三种办法都用到了两个指针,符合题目要求的只有最后一种. 第一种办法:用数组倒着存前半段的链表的值,然后和后半段链表的值进行比较.这种解法运行的时间最久可

判断一个链表是不是回文链表

第一种方法: 额外空间复杂度O(N) ,遍历链表时,将元素入栈,再次遍历时,从栈中弹出元素,比较两者的大小,就可以判断是不是回文链表第二种方法:利用快慢指针,先找到链表的中间位置,然后反转链表的后半部分,再分别从链表两头遍历比较大小,最后将链表恢复为原始结构 public class PalindromeLinkedList { public static void main(String[] args) { Node head = new Node(1); head.next = new No

一个5位数,判断它是不是回文数

题目:一个5位数,判断它是不是回文数.即12321是回文数,个位与万位相同,十位与千位相同. 1 package com.li.FiftyAlgorthm; 2 3 import java.util.Scanner; 4 5 /** 6 * 题目:一个5位数,判断它是不是回文数.即12321是回文数,个位与万位相同,十位与千位相同. 7 * @author yejin 8 */ 9 public class Palindrom { 10 public static void main(Strin

Java编程判断是否是回文数

import javax.swing.JOptionPane; 自然数中还有一类数被称为回文数.回文数就是一个数的两边对称,如11,121,1221,9339,30203等等 public class CircleTest{ public static void main(String[] args){ String inputValue = JOptionPane.showInputDialog("请输入一个整数"); StringBuffer source = new String

java编写输入一个数判断是否是回文数,所谓回文数比如121,1221,6778776

package com.hao947; import java.util.Scanner; public class demo5 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int x = 0; x = scanner.nextInt(); System.out.println("请输入一个4-8位的数"); int dig[] = new int[10]; i

C语言-郝斌笔记-004判断是否为回文数

判断是否为回文数 1 # include <stdio.h> 2 3 int main(void) 4 { 5 int val; //存放待判断的数字 6 int m; 7 int sum = 0; 8 9 printf("请输入您需要判断的数字: "); 10 scanf("%d", &val); 11 12 m = val; 13 while (m) 14 { 15 sum = sum * 10 + m%10; 16 m /= 10; 17

9 Palindrome Number(判断是否为回文数Easy)

题目意思:判断是否为回文数,不许使用额外空间 ps:一直不理解额外空间的意思,int能用吗 思路:1.比较头尾 2.翻转,越界问题需考虑 1 class Solution { 2 public: 3 bool isPalindrome(int x) { 4 if(x<0)return false; 5 if(x==0)return true; 6 int start,end,num=0,temp=x; 7 while(temp){ 8 num++; 9 temp=temp/10; 10 } 11