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/2)空间
public static boolean isPalindrome(ListNode head) { // ArrayList<Integer> nodeVal=new ArrayList<>();
LinkedList<Integer> nodeVal=new LinkedList<>(); if(head==null||head.next==null)
return true;
ListNode slow=head;
ListNode fast=head; nodeVal.add(0,slow.val);
while(fast.next!=null&&fast.next.next!=null)
{
fast=fast.next.next;
slow=slow.next;
nodeVal.add(0,slow.val);
} ListNode cur=slow;
if(fast.next!=null)//链表长度为偶数
cur=slow.next;
int i=0;
while(cur!=null)
{
if(nodeVal.get(i)!=cur.val)
return false;
cur=cur.next;
i++;
}
return true;
}
另外一种解法:在第一种的思路的基础上。我们要实现一个倒序,我们干嘛不用现成的数据结构-栈。于是把链表前半段压栈,然后出栈和后面的链表依次比較,这样的执行时间最短。但由于用到了栈还是不符合题目要求。
代码:
//用栈实现
public static boolean isPalindrome2(ListNode head) { Stack<ListNode> stack=new Stack<>();
ListNode slow=head;
ListNode fast=head; if(fast==null||fast.next==null)//0个节点或是1个节点
return true; stack.push(slow);
while(fast.next!=null&&fast.next.next!=null)
{ fast=fast.next.next;
slow=slow.next;
stack.push(slow);
}
if(fast.next!=null)//链表长度为偶数
slow=slow.next; ListNode cur=slow;
while(cur!=null)
{
if(cur.val!=stack.pop().val)
return false;
cur=cur.next;
}
return true; }
第三种:我们这样想,我们可不能够不借助外在的存储实现倒序呢,事实上是能够的,链表反转的时候我们就没有借助外在存储。
思路是把后半段的原地链表反转然后和前半段进行比較(当然你也能够反转前半段)执行时间略微比另外一种慢一些。可是符合题目O(1)空间复杂度的要求
代码:
//链表原地转置实现o(1)空间复杂度
public static boolean isPalindrome3(ListNode head) {
ListNode slow=head;
ListNode fast=head; if(fast==null||fast.next==null)//0个节点或是1个节点
return true; while(fast.next!=null&&fast.next.next!=null)
{
fast=fast.next.next;
slow=slow.next;
}
//对链表后半段进行反转
ListNode midNode=slow;
ListNode firNode=slow.next;//后半段链表的第一个节点
ListNode cur=firNode.next;//插入节点从第一个节点后面一个開始
firNode.next=null;//第一个节点最后会变最后一个节点
while(cur!=null)
{
ListNode nextNode=cur.next;//保存下次遍历的节点
cur.next=midNode.next;
midNode.next=cur;
cur=nextNode;
} //反转之后对前后半段进行比較
slow=head;
fast=midNode.next;
while(fast!=null)
{
if(fast.val!=slow.val)
return false;
slow=slow.next;
fast=fast.next;
}
return true; }
LeetCode234_PalindromeLinkedList (推断是否为回文链表) Java题解的更多相关文章
- 领扣(LeetCode)回文链表 个人题解
请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶:你能否用 O(n) 时间复杂 ...
- Java判断链表是否为回文链表
请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 思路:1.通过快慢指针,来遍历链表 ...
- Java实现 LeetCode 234 回文链表
234. 回文链表 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否 ...
- lintcode 中等题:Palindrome Linked List 回文链表
题目 回文链表 设计一种方式检查一个链表是否为回文链表. 样例 1->2->1 就是一个回文链表. 挑战 O(n)的时间和O(1)的额外空间. 解题 法一: 再定义一个链表,存放链表反转的 ...
- LeetCode OJ:Palindrome Linked List(回文链表判断)
Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O(n) time ...
- 234 Palindrome Linked List 回文链表
请检查一个链表是否为回文链表. 进阶:你能在 O(n) 的时间和 O(1) 的额外空间中做到吗? 详见:https://leetcode.com/problems/palindrome-linked- ...
- [LC]234题 Linked List Cycle (回文链表)(链表)
①中文题目 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2输出: false示例 2: 输入: 1->2->2->1输出: true进阶:你能否用 O(n) 时间 ...
- LeetCode 234:回文链表 Palindrome Linked List
请判断一个链表是否为回文链表. Given a singly linked list, determine if it is a palindrome. 示例 1: 输入: 1->2 输出: ...
- leetcode面试题 02.06. 回文链表,解题心路
目录 leetcode面试题 02.06. 回文链表,解题心路 1.题目描述 2.java语言题解一 3.java语言题解二 4.C语言题解一 leetcode面试题 02.06. 回文链表,解题心路 ...
随机推荐
- vue 父子组件双向绑定
vue组件有2大特性: 1.全局组件和局部组件 2.父子组件的数据传递 接下来直接用demo直接看如何传值(静态传值) father.vue <template> <div> ...
- Selenium学习第二天,了解Selenium工作模式与学习Selenium需要具备的知识与工具。
Selenium学习网站: 1.http://www.ltesting.net/ceshi/open/kygncsgj/selenium/2014/0408/207237.html——好像是对API的 ...
- 微信小程序组件解读和分析:三、swiper滑块视图
swiper滑块组件说明: 滑块视图容器,用于展示图片,可以通过用户拖拽和设置自动切换属性控制图片的切换 组件的使用示例的运行效果如下: 下面是WXML代码: [XML] 纯文本查看 复制代码 ? ...
- TI 77GHZ雷达开发套件 RDP-DC100
RDP-DC100用户使用手册 目录 1. 硬件说明... 3 1.1. 官方处理板的修 ...
- 浏览器的两种模式quirks mode 和strict mode
关键字: javascript.quirks mode.strict mode 在看js代码时,有时会看到关于quirks mode(怪异模式)和strict mode(严格格式)的东西,一直也没深究 ...
- C#基础知识面试经典[整理]
个人网站:http://www.51pansou.com .net视频下载:.net视频教程 .net源码下载:.net源码 当初学 C# 时是找个人大概问了一下数据类型和分支语句就开始做项目了.这两 ...
- 在eclipse里如何快速定位到某一行?
使用快捷键ctrl+L讲每一行的行号显示出来:在eclipse的某一行的最左边,右键——show Line Numbers就可以将行数都显示出来.
- MySql学习笔记(二) —— 正则表达式的使用
前面介绍利用一些关键字搭配相应的SQL语句进行数据库查找过滤,但随着过滤条件的复杂性的增加,where 子句本身的复杂性也会增加.这时我们就可以利用正则表达式来进行匹配查找. 1.基本字符匹配 ' o ...
- 踩过好多次的坑 - ajax访问【mango】项目的service
这个坑真的是踩过好多次了,好记性不如烂笔头,我总是太高估我的记忆力,这次真的是要写下来了. 项目是用的seam框架 + hibernate搭建的,架构是前辈们搭好的劳动成果,在配置service的访问 ...
- v-bind、v-on、计算属性
v-bind 缩写 <!-- 完整语法 --> <a v-bind:href="url">...</a> <!-- 缩写 --> & ...