请判断一个链表是否为回文链表。

Given a singly linked list, determine if it is a palindrome.

示例 1:

输入: 1->2
输出: false

示例 2:

输入: 1->2->2->1
输出: true

进阶:

你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

Follow up:

Could you do it in O(n) time and O(1) space?

解题思路:

首先是寻找链表中间节点,这个可以用快慢指针来解决,快指针速度为2,慢指针速度为1,快指针遍历完链表时,慢指针刚好走到中间节点(相对)。

然后是判断是否是回文链表:

不考虑进阶要求的话,方法千千万。可以把前半部分暂存入新的数组、链表、哈希表等等数据结构,然后依次倒序取出,与后半部分链表每个节点的值对比即可。更简单的是直接用数据结构 - 栈,先进后出,把节点压入栈中,到中间节点后,依次从栈中弹出节点,与后半部分的节点值对比即可。

直接思考进阶要求,在 O(1) 的空间复杂度下,只能选择操作原链表来完成该题。好在这道题只要求返回布尔值,即便把原链表改变了也不用担心。我们可以将链表后半部分 反转,利用迭代法反转链表,时间复杂度为 O(n),空间复杂度为 O(1),所以符合要求。然后从原链表头节点 与 反转后后半部分链表头节点开始对比值即可。

反转链表的各种详细方法在前几日的那道题中已经详细解答过,未看过的朋友可以先看那一篇:LeetCode 206:反转链表 Reverse Linked List

Java:

class Solution {
public boolean isPalindrome(ListNode head) {
ListNode fast = head;
ListNode slow = head;
if (fast == null || fast.next == null) return true;
while (fast.next != null && fast.next.next != null) {
fast = fast.next.next;
slow = slow.next;
}
ListNode newHead = reverseList(slow.next);
while (newHead != null) {
if (head.val != newHead.val) return false;
head = head.next;
newHead = newHead.next;
}
return true;
}
//反转链表函数--详情请看前文
private ListNode reverseList(ListNode head) {
if (head.next == null) return head;
ListNode pre = null;
ListNode tmp;
while (head!= null) {
tmp = head.next;//tmp暂存当前节点的下一个节点
head.next = pre;//当前节点下一个指向pre
pre = head;//刷新pre
head = tmp;//刷新当前节点为tmp
}
return pre;
}
}

Python:

class Solution:
def isPalindrome(self, head: ListNode) -> bool:
fast, slow = head, head
if not fast or not fast.next: return True
while fast.next and fast.next.next:
fast = fast.next.next
slow = slow.next
newHead = self.reverseList(slow.next)
while newHead:
if newHead.val != head.val: return False
newHead = newHead.next
head = head.next
return True def reverseList(self, head: ListNode) -> ListNode:
if not head or not head.next:
return head
pre, tmp = None, None
while (head):
tmp = head.next
head.next = pre
pre = head
head = tmp
return pre

欢迎关注公.众号一起学习: 爱写Bug

LeetCode 234:回文链表 Palindrome Linked List的更多相关文章

  1. leetcode 234 回文链表 Palindrome Linked List

    要求用O(n)时间,和O(1)空间,因此思路是用本身链表进行判断,既然考虑回文,本方法思想是先遍历一次求链表长度,然后翻转前半部分链表:然后同时对前半部分链表和后半部分链表遍历,来判断对应节点的值是否 ...

  2. Java实现 LeetCode 234 回文链表

    234. 回文链表 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否 ...

  3. [Swift]LeetCode234. 回文链表 | Palindrome Linked List

    Given a singly linked list, determine if it is a palindrome. Example 1: Input: 1->2 Output: false ...

  4. Leetcode 234. 回文链表(进阶)

    1.题目描述 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O ...

  5. 回文链表 · Palindrome Linked List

    [抄题]: 设计一种方式检查一个链表是否为回文链表.1->2->1 就是一个回文链表. [暴力解法]: 时间分析: 空间分析: [思维问题]: 以为要从从后往前扫描,不知道调用revers ...

  6. LeetCode 234——回文链表

    1. 题目 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O( ...

  7. [LeetCode] 234. 回文链表 ☆(翻转链表)

    描述 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2输出: false示例 2: 输入: 1->2->2->1输出: true 进阶:你能否用 O(n) 时间复杂 ...

  8. LeetCode 234. 回文链表

    class Solution { public: bool isPalindrome(ListNode* head) { deque<int> d1, d2; ListNode* p = ...

  9. Leetcode:234 回文链表

    leetcode:234 回文链表 关键点:请判断一个链表是否为回文链表.示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true. ...

随机推荐

  1. Linux 安装指定版本Git

    git二进制文件下载地址: https://mirrors.edge.kernel.org/pub/software/scm/git/ 1.下载v2.21.0版本 wget https://mirro ...

  2. DatabaseLibrary -数据库操作

    操作数据库: Table Must Exist 验证表必须存在,存在则Pass,反之Fail Delete All Rows From Table 删除数据库中表的所有行 Execute Sql St ...

  3. Google_PWA_ServiceWork_渐进式 Web 应用_给应用提供离线体验

    前言:今天结识了google PWA提供的一个对移动端Web应用提供离线体验的一个功能,感觉很有用.我这里不分享自己的写法和代码.官网文档说的很详细,直接粘过来大家看吧. 推荐官网地址:你的第一个渐进 ...

  4. java自适应响应式 企业网站源码 SSM freemaker生成静态化 手机 平板 PC springmvc

    java 企业网站源码 前后台都有 静态模版引擎, 代码生成器大大提高开发效率 前台: 支持两套模版, 可以在后台切换 系统介绍: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用 ...

  5. kafka集群在消息消费出现无法找到topic分区的处理解决

    最近几天在做spark数据同步过程中,中间通过kafka集群处理消息,每次同步到一半就会出现同步不了 查看日志如下: 最开始看到这个问题很懵逼,完全找不到解决问题的切入口,期间也询问了架构师-因为这个 ...

  6. js 时分秒转化为秒

    var time = '00:02:10'; var hour = time.split(':')[0]; var min = time.split(':')[1]; var sec = time.s ...

  7. Mysql—存储引擎详解

    存储引擎基本操作 查看数据库支持的所有的存储引擎 mysql> show engines; 查看数据库目前使用的引擎 mysql> show varlables like "%s ...

  8. Docker 类面试题(常见问题)

    Docker 常见问题汇总   镜像相关 1.如何批量清理临时镜像文件? 可以使用sudo docker rmi $(sudo docker images -q -f danging=true)命令 ...

  9. hbase相关操作

    hbase安装 下载 wget http://apache.gree.com/apache/hbase/hbase-1.2.11/hbase-1.2.11-bin.tar.gz tar -zxvf b ...

  10. GitHub如何配置SSH Key

    https://github.com/xiangshuo1992/preload.git git@github.com:xiangshuo1992/preload.git 这两个地址展示的是同一个项目 ...