leetcode 234. Palindrome Linked List
Posted clnsx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode 234. Palindrome Linked List相关的知识,希望对你有一定的参考价值。
题目内容
Given a singly linked list, determine if it is a palindrome.
Example:
Input: 1->2
Output: false
Example 2:
Input: 1->2->2->1
Output: true
Follow up:
Could you do it in O(n) time and O(1) space?
分析过程
- 题目归类:
链表反转,fast/slow双指针法 - 题目分析:
这道题归到easy其实是不对的,应该归到medium,因为如果要考虑O(n)时间复杂度或者O(1)的空间复杂度,需要使用到链表反转和fast/slow指针方法。- 边界分析:
- 空值分析
简单的判断即可 - 循环边界分析
- 方法分析:
由于slow链头可以找到中间部分,在反转(中间到最后)的链表,就可以从头开始比较了。 - 数据结构分析
链表反转,经典的6行法。
fast/slow指针一个快两倍一个快一倍 - 状态机
- 状态转移方程
- 最优解
- 测试用例构建
代码实现
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isPalindrome(ListNode head) {
if(head == null)
return true;
ListNode fast = head;
ListNode slow = head;
while(fast!=null&&fast.next!=null){
fast = fast.next.next;
slow = slow.next;
}
if(fast != null)
slow = slow.next;
slow = reverse(slow);
fast = head;
while(slow!=null){
if(head.val != slow.val){
return false;
}
head= head.next;
slow = slow.next;
}
return true;
}
ListNode reverse(ListNode head){
ListNode prev = null;
while(head!=null){
ListNode tmp = head.next;
head.next = prev;
prev = head;
head = tmp;
}
return prev;
}
}
效率提高
拓展问题
Valid Palindrome Easy
Reverse Linked List Easy
以上是关于leetcode 234. Palindrome Linked List的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode 234. Palindrome Linked List
Java [Leetcode 234]Palindrome Linked List
LeetCode 234. Palindrome Linked List
leetcode 234. Palindrome Linked List