leetcode234 回文链表 两种做法(stack(空间非O(1)),空间O(1))
link: leetcode234 回文链表
方法1, 快慢指针,把前半部分存入栈中和后半部分比较
public boolean isPalindrome(ListNode head) {
if(head == null || head.next == null) return true;
Stack<Integer> stack = new Stack<>();
ListNode slow = head;
ListNode fast = head;
while(true){
stack.push(slow.val);
slow = slow.next;
if(fast.next == null){//odd
stack.pop();
break;
}
if(fast.next.next == null){ //even
break;
}
fast = fast.next.next;
}
boolean flag = true;
while (!stack.empty() && slow != null){
int temp = stack.pop();
if(slow.val == temp){
slow = slow.next;
}else {
flag = false;
break;
}
}
if(!stack.empty() || slow != null)
flag = false;
return flag;
}
方法2, 快慢指针,把前半部分反转与后半部分比较
public boolean isPalindrome2(ListNode head) { // O(1)
if(head == null || head.next == null) return true;
if(head.next.next == null){
if(head.next.val == head.val){
return true;
}else{
return false;
}
}
ListNode slow = head;
ListNode fast = head;
int cnt= 0;
while(true){
slow = slow.next;
cnt ++;
if(fast.next == null){//odd
cnt --;
break;
}
if(fast.next.next == null){ //even
break;
}
fast = fast.next.next;
}
// System.out.println("after while, slow.val =" +slow.val);
ListNode fan = head;
ListNode temp = head;
ListNode newHead = head;
int n = 0;
// System.out.println("cnt= " + cnt);
while (n < cnt - 1){
temp = fan.next;
fan.next = fan.next.next;
temp.next = newHead;
newHead = temp;
// System.out.println("temp =" +temp.val);
n++;
}
fan.next = null;
boolean f = true;
while(true){
// System.out.println(slow.val + " | " + newHead.val);
if(slow.val == newHead.val){
slow = slow.next;
newHead = newHead.next;
}else {
f = false;
break;
}
if(slow == null && newHead != null){
f = false;
break;
}else if(slow != null && newHead == null){
f = false;
break;
}else if(slow == null && newHead == null){
break;
}
}
return f;
}
leetcode234 回文链表 两种做法(stack(空间非O(1)),空间O(1))的更多相关文章
- [Swift]LeetCode234. 回文链表 | Palindrome Linked List
Given a singly linked list, determine if it is a palindrome. Example 1: Input: 1->2 Output: false ...
- LeetCode234 回文链表
请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶:你能否用 O(n) 时间复杂 ...
- Longest Palindromic Substring (最长回文字符串)——两种方法还没看,仍需认真看看
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
- leetcode206 反转链表 两种做法(循环,递归)
反转链表 leetcode206 方法1 循环 public ListNode reverseList(ListNode head) { if (head == null || head.next = ...
- [LeetCode] Palindrome Linked List 回文链表
Given a singly linked list, determine if it is a palindrome. Follow up: Could you do it in O(n) time ...
- 如何判断一个单向链表是否为回文链表(Palindrome Linked List)
题目:给定一个单向链表,判断它是不是回文链表(即从前往后读和从后往前读是一样的).原题见下图,还要求了O(n)的时间复杂度O(1)的空间复杂度. 我的思考: 1,一看到这个题目,大脑马上想到的解决方案 ...
- [LeetCode] 234. Palindrome Linked List 回文链表
Given a singly linked list, determine if it is a palindrome. Example 1: Input: 1->2 Output: false ...
- lintcode 中等题:Palindrome Linked List 回文链表
题目 回文链表 设计一种方式检查一个链表是否为回文链表. 样例 1->2->1 就是一个回文链表. 挑战 O(n)的时间和O(1)的额外空间. 解题 法一: 再定义一个链表,存放链表反转的 ...
- 回文链表 · Palindrome Linked List
[抄题]: 设计一种方式检查一个链表是否为回文链表.1->2->1 就是一个回文链表. [暴力解法]: 时间分析: 空间分析: [思维问题]: 以为要从从后往前扫描,不知道调用revers ...
随机推荐
- docker数据卷挂载
docker数据卷挂载笔记 我们的服务运行时必不可少的会产生一些日志,或是我们需要把容器内的数据进行备份,甚至多个容器之间进行数据共享,这必然涉及容器的数据管理操作. 容器中管理数据主要有两种方式: ...
- 通过三层交换机实现不同VLAN间的通信(案例+Cisco模拟器配置)
如图,其中PC1和4位于销售部VLAN10,PC2和PC5位于市场部VLAN20,PC3和PC5位于财务部VLAN30,各主机的IP地址以及子网掩码已列出,下面将讲解如何配置利用三层交换机来实现不同V ...
- 最简单的Android项目(NDK命令行编译)
Android的NDK编程需要下载NDK编译环境,可以从官网下载window64位版,然后解压到任意目录即可. NDK的实现其实是利用里Java的jni方法,所以前期的步骤可以参考jni的实现方法,只 ...
- java高并发核心要点|系列5|CPU内存伪共享
上节提到的:伪共享,今天我们来说说. 那什么是伪共享呢? 这得从CPU的缓存结构说起.以下如图,CPU一般来说是有三级缓存,1 级,2级,3级,越上面的,越靠近CPU的,速度越快,成本也越高.也就是说 ...
- Python核心技术与实战——十二|Python的比较与拷贝
我们在前面已经接触到了很多Python对象比较的例子,例如这样的 a = b = a == b 或者是将一个对象进行拷贝 l1 = [,,,,] l2 = l1 l3 = list(l1) 那么现在试 ...
- 跳跃表-原理及Java实现
跳跃表-原理及Java实现 引言: 上周现场面试阿里巴巴研发工程师终面,被问到如何让链表的元素查询接近线性时间.笔者苦思良久,缴械投降.面试官告知回去可以看一下跳跃表,遂出此文. 跳跃表的引入 我们知 ...
- Maven私服仓库
Maven私服仓库 现象:在maven install的时候,会做以下事情 [INFO] Installing /Users/cqq/Documents/VanDreamPro/vandream-er ...
- ZROI 19.08.09模拟赛
传送门 写在前面:为了保护正睿题目版权,这里不放题面,只写题解. A \(70pts:\) 维护一个栈,从一侧向另一侧扫描,如果新加入的元素与当前栈顶相同,则出栈,否则进栈.显然一个子串是括号序列,当 ...
- 【Luogu5294】[HNOI2019]序列
题目链接 题意 给定一个序列,要求将它改造成一个非降序列,修改一个数的代价为其改变量的平方. 最小化总代价. 另有\(Q\) 次询问,每次修改一个位置上的数.(询问之间独立,互不影响) Sol 神仙 ...
- Scala传递参数遇到的坑
1.方法中的参数全为val型. 例: def insertMap(map:=>Map[String,Int]):Unit={ map+=("b"->2) //报错 ...