leetcode题目234.回文链表(快慢指针+辅助空间-简单)
题目描述:
请判断一个链表是否为回文链表。
示例 1: 输入: 1->2
输出: false
示例 2: 输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
思路分析:
思路一:借助辅助栈和辅助队列,链表节点依次入队列和入栈,依次出栈和出队,判断是否相等即可
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public static boolean isPalindrome(ListNode head) { //借助一个栈和一个队列去判断
Deque<ListNode> deque = new LinkedList<>();
Stack<ListNode> helper = new Stack<>();
int count = 0;
while (head != null) {
deque.addLast(head);
helper.push(head);
head = head.next;
count++;
}
for (int i = 0; i < count; i++) {
if (deque.poll().val != helper.pop().val) {
return false;
}
} return true;
}
}
时间复杂度:O(n)
空间复杂度:O(2n)->O(n)
思路二:快慢指针
思想很简单,用2个指针,一个low,一个fast,fast是low的2倍,所以可以达到2分链表的效果,在移动指针时同时对前半部分链表进行反转。最后直接比较被分开的2个链表。因为不能改变当前slow的next,不然就无法跳到下一个元素,所以这里用pre和prepre实现指针的反转。
代码实现:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
//快慢指针:边遍历边翻转前半段
public static boolean isPalindrome(ListNode head) { if (head == null || head.next == null) {
return true;
}
ListNode slow = head;
ListNode fast = head.next;
ListNode preNode = null;
ListNode pre2Node = null;
while (fast != null && fast.next != null) { preNode = slow;
//此处因为不能丢失slow.next,所以使用preNode和pre2Node实现链表的翻转
slow = slow.next;
fast = fast.next.next;
preNode.next = pre2Node;
pre2Node = preNode;
}
//链表被分成两个部分,qNode表示后链表的头
ListNode qNode = slow.next;
//注意,因为之前没有指定slow.next指向哪个节点,此处要做指定(之前为了持续遍历,slow.next一直指向原链表的下一个节点)
slow.next = preNode;
//考虑奇偶:如果链表节点个数为偶数,则前链表的表头为slow,否则为slow.next
ListNode pNode = fast == null ? slow.next : slow;
while (qNode != null && pNode != null) {
if (qNode.val != pNode.val) {
return false;
}
qNode = qNode.next;
pNode = pNode.next;
}
return true;
}
}
时间复杂度:O(n)
空间复杂度:O(1)
leetcode题目234.回文链表(快慢指针+辅助空间-简单)的更多相关文章
- [LeetCode题解]234. 回文链表 | 快慢指针 + 反转链表
解题思路 找到后半部分链表,再反转.然后与前半部分链表比较 代码 /** * Definition for singly-linked list. * public class ListNode { ...
- Leetcode:234 回文链表
leetcode:234 回文链表 关键点:请判断一个链表是否为回文链表.示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true. ...
- Java实现 LeetCode 234 回文链表
234. 回文链表 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否 ...
- Leetcode 234. 回文链表(进阶)
1.题目描述 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O ...
- LeetCode 234——回文链表
1. 题目 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O( ...
- [LeetCode] 234. 回文链表 ☆(翻转链表)
描述 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2输出: false示例 2: 输入: 1->2->2->1输出: true 进阶:你能否用 O(n) 时间复杂 ...
- leetcode 234 回文链表 Palindrome Linked List
要求用O(n)时间,和O(1)空间,因此思路是用本身链表进行判断,既然考虑回文,本方法思想是先遍历一次求链表长度,然后翻转前半部分链表:然后同时对前半部分链表和后半部分链表遍历,来判断对应节点的值是否 ...
- LeetCode 234. 回文链表
class Solution { public: bool isPalindrome(ListNode* head) { deque<int> d1, d2; ListNode* p = ...
- [LeetCode] 234. Palindrome Linked List 回文链表
Given a singly linked list, determine if it is a palindrome. Example 1: Input: 1->2 Output: false ...
随机推荐
- luogu2858奶牛零食题解--区间DP
题目链接 https://www.luogu.org/problemnew/show/P2858 一句话题意: https://cn.vjudge.net/problem/POJ-3186#autho ...
- SPOJ-MobileService--线性DP
题目链接 https://www.luogu.org/problemnew/show/SP703 方法一 分析 很显然可以用一个四维的状态\(f[n][a][b][c]\)表示完成第i个任务时且三人 ...
- Pytorch学习之源码理解:pytorch/examples/mnists
Pytorch学习之源码理解:pytorch/examples/mnists from __future__ import print_function import argparse import ...
- 对数据库ID进行散裂化计算
import basehash class Hasher: """ 对数据库ID进行散列化计算 """ base36 = basehash. ...
- JS原生实现照片抽奖
HTML表格标记实现九宫格,放入九张图片.利用CSS的滤镜属性控制图片的透明度.Javascript实现抽奖和中奖. 可以做为教师上课,随机抽取回答问题的同学,使学生感受到随机的公平性,简单有趣! 点 ...
- python 修改、读取图片元数据
图片元数据 图片元数据(metadata)是嵌入到图片文件中的一些标签.比较像文件属性,但是种类繁多.常见的几种标准有: EXIF:通常被数码相机在拍摄照片时自动添加,比如相机型号.镜头.曝光.图片尺 ...
- centeros7安装mysql
转载自:https://www.linuxidc.com/Linux/2016-09/135288.htm 安装之前先安装基本环境:yum install -y perl perl-Module-Bu ...
- 使用FindCmdLineSwitch处理命令行参数
一.四个形式(变体) .function FindCmdLineSwitch(const Switch: string; const Chars: TSysCharSet; IgnoreCase: B ...
- oracle 初试 hint
最近在研究oracle的视图问题,本来想全转成 物化视图(materialized view)的,这样可以极大提升系统的响应时间,无奈工作量太大,所以就研究了SQL优化的问题. 我这个普通视图 有36 ...
- JavaScript中定义类的方式详解
本文实例讲述了JavaScript中定义类的方式.分享给大家供大家参考,具体如下: Javascript本身并不支持面向对象,它没有访问控制符,它没有定义类的关键字class,它没有支持继承的exte ...