[LeetCode] 234. Palindrome Linked List 解题思路
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) 时间, O(n)额外空间。
如果是 O(1)额外空间,就没有思路,在网上找了下,找到一个解决方案。值得注意的是,这个方案执行过程中,会改变原来列表的结构。
- 利用快指针、慢指针定位列表的中间元素。快指针每次走两步,而慢指针每次只走一步,当快指针走到列表末尾,慢指针刚好在列表中间。
- 根据慢指针,将列表前、后两半分开,并将后半列表翻转。
- 对前半列表 和 翻转后的后半列表依次对比,判断原列表是否是回文的。
bool isPalindrome(ListNode* head) {
if(head == NULL || head->next == NULL){
return true;
}
if(head->next->next == NULL){
return (head->val == head->next->val);
}
if(head->next->next->next == NULL){
return (head->val == head->next->next->val);
}
// 找列表中间元素
ListNode* slow = head;
ListNode* fast = head->next;
while (slow != NULL && fast != NULL && fast->next != NULL) {
slow = slow->next;
fast = fast->next->next;
}
// 翻转后半部分元素
ListNode* newHead = slow->next;
slow->next = NULL;
ListNode* p = newHead->next;
ListNode* pNext = newHead->next->next;
newHead->next = NULL;
while (pNext != NULL) {
p->next = newHead;
newHead = p;
p = pNext;
pNext = pNext->next;
}
p->next = newHead;
newHead = p;
// 判断是否是回文
ListNode* p1 = head;
ListNode* p2 = newHead;
while (p2 != NULL) {
if (p1->val != p2->val) {
return false;
}
p1 = p1->next;
p2 = p2->next;
}
return true;
}
[LeetCode] 234. Palindrome Linked List 解题思路的更多相关文章
- Java [Leetcode 234]Palindrome Linked List
题目描述: Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O(n) ...
- Java for LeetCode 234 Palindrome Linked List
解题思路: O(1)的空间复杂度,意味着不能通过开一个List来解决问题.我们可以把List分成前后两个部分,后半部分通过指针的相互赋值进行翻转即可. JAVA实现如下: public static ...
- 【LeetCode】234. Palindrome Linked List 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- [LeetCode] 234. Palindrome Linked List 回文链表
Given a singly linked list, determine if it is a palindrome. Example 1: Input: 1->2 Output: false ...
- LeetCode 234 Palindrome Linked List
Given a singly linked list, determine if it is a palindrome. 思路: 回文结构从后向前遍历与从前向后遍历的结果是相同的,可以利用一个栈的结构 ...
- LeetCode 234. Palindrome Linked List (回文链表)
Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O(n) time ...
- (easy)LeetCode 234.Palindrome Linked List
Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O(n) time ...
- LeetCode 234 Palindrome Linked List(回文链表)(*)(?)
翻译 给定一个单链表,确定它是否是回文的. 跟进: 你能够在O(n)时间和O(1)空间下完毕它吗? 原文 Given a singly linked list, determine if it is ...
- Leetcode 234 Palindrome Linked List 复杂度为时间O(n) 和空间(1)解法
1. 问题描写叙述 给定一个单链表,推断其内容是不是回文类型. 比如1–>2–>3–>2–>1.时间和空间复杂都尽量低. 2. 方法与思路 1)比較朴素的算法. 因为给定的数据 ...
随机推荐
- 【ADO.NET】1、简单配置与使用
1.一些基础的知识点 ExecuteReader(); //返回查询到的数据,一次一行,用于 selectExecuteNonQuery(); //返回影响的行数,用于 delete,insert,u ...
- clr介绍
CLR(公用语言运行时)和Java虚拟机一样也是一个运行时环境,它负责资源管理(内存分配和垃圾收集),并保证应用和底层操作系统之间必要的分离..NET提供了一个运行时环境,叫做公用语言运行时(Comm ...
- ubuntu上 安装 基于sphinx 的 coreseek 全文搜索
原生sphinx不支持中文, sphinx-for-chinese匹配中文时也不返回结果 ,真纠结, 最好试了 coreseek,这个能正确返回结果了, 所以记录一下 1 http://www.co ...
- ubuntu server 安装
http://tigerlchen.iteye.com/blog/1765765 解决CDROM找不到的bug
- EF初始化mysql数据库codefirst
EF使用Code First修改生成数据库表名的方法 1. 重写OnModelCreating,去掉表名复数 System.Data.Entity.ModelConfiguration.Convent ...
- c语言位运算符
C语言既具有高级语言的特点,又具有低级语言的功能. 所谓位运算是指进行二进制位的运算. C语言提供的位运算: 运算符 含义 & 按位与 | 按位或 ∧ 按位异或 ∽ ...
- java String字符串——进度1
String字符串 在JAVA中提供了多种创建字符串对象的方法,这里介绍最简单的两种, 第一种是直接赋值, 第二种是使用String类的构造方法: 如下所示: Strin ...
- C# MySql 操作类
/* MySql 类 */ using System; using System.Collections.Generic; using System.Linq; using System.Text; ...
- Git中的fetch和pull
http://blog.haohtml.com/archives/12674 Git中从远程的分支获取最新的版本到本地有这样2个命令: 1. git fetch:相当于是从远程获取最新版本到本地,不会 ...
- [python]类与类中的列表
最近在用类中的列表时出现一件怪事 实例2中的列表,竟然有实例1中的数据. 查了半天发现是list的append方法的问题. 将全部的list.append(value) 换成 list = list ...