题目:

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)的空间时间复杂度。总共想了三种办法,三种办法都用到了两个指针,符合题目要求的仅仅有最后一种。

第一种办法:用数组倒着存前半段的链表的值。然后和后半段链表的值进行比較。

这样的解法执行的时间最久可能是由于数组倒着插入比較耗时。

代码:

  1. //用数组实现 o(n/2)空间
  2. public static boolean isPalindrome(ListNode head) {
  3.  
  4. // ArrayList<Integer> nodeVal=new ArrayList<>();
  5. LinkedList<Integer> nodeVal=new LinkedList<>();
  6.  
  7. if(head==null||head.next==null)
  8. return true;
  9. ListNode slow=head;
  10. ListNode fast=head;
  11.  
  12. nodeVal.add(0,slow.val);
  13. while(fast.next!=null&&fast.next.next!=null)
  14. {
  15. fast=fast.next.next;
  16. slow=slow.next;
  17. nodeVal.add(0,slow.val);
  18. }
  19.  
  20. ListNode cur=slow;
  21. if(fast.next!=null)//链表长度为偶数
  22. cur=slow.next;
  23. int i=0;
  24. while(cur!=null)
  25. {
  26. if(nodeVal.get(i)!=cur.val)
  27. return false;
  28. cur=cur.next;
  29. i++;
  30. }
  31. return true;
  32. }

另外一种解法:在第一种的思路的基础上。我们要实现一个倒序,我们干嘛不用现成的数据结构-栈。于是把链表前半段压栈,然后出栈和后面的链表依次比較,这样的执行时间最短。但由于用到了栈还是不符合题目要求。

代码:

  1. //用栈实现
  2. public static boolean isPalindrome2(ListNode head) {
  3.  
  4. Stack<ListNode> stack=new Stack<>();
  5. ListNode slow=head;
  6. ListNode fast=head;
  7.  
  8. if(fast==null||fast.next==null)//0个节点或是1个节点
  9. return true;
  10.  
  11. stack.push(slow);
  12. while(fast.next!=null&&fast.next.next!=null)
  13. {
  14.  
  15. fast=fast.next.next;
  16. slow=slow.next;
  17. stack.push(slow);
  18. }
  19. if(fast.next!=null)//链表长度为偶数
  20. slow=slow.next;
  21.  
  22. ListNode cur=slow;
  23. while(cur!=null)
  24. {
  25. if(cur.val!=stack.pop().val)
  26. return false;
  27. cur=cur.next;
  28. }
  29. return true;
  30.  
  31. }

第三种:我们这样想,我们可不能够不借助外在的存储实现倒序呢,事实上是能够的,链表反转的时候我们就没有借助外在存储。

思路是把后半段的原地链表反转然后和前半段进行比較(当然你也能够反转前半段)执行时间略微比另外一种慢一些。可是符合题目O(1)空间复杂度的要求

代码:

  1. //链表原地转置实现o(1)空间复杂度
  2. public static boolean isPalindrome3(ListNode head) {
  3. ListNode slow=head;
  4. ListNode fast=head;
  5.  
  6. if(fast==null||fast.next==null)//0个节点或是1个节点
  7. return true;
  8.  
  9. while(fast.next!=null&&fast.next.next!=null)
  10. {
  11. fast=fast.next.next;
  12. slow=slow.next;
  13. }
  14. //对链表后半段进行反转
  15. ListNode midNode=slow;
  16. ListNode firNode=slow.next;//后半段链表的第一个节点
  17. ListNode cur=firNode.next;//插入节点从第一个节点后面一个開始
  18. firNode.next=null;//第一个节点最后会变最后一个节点
  19. while(cur!=null)
  20. {
  21. ListNode nextNode=cur.next;//保存下次遍历的节点
  22. cur.next=midNode.next;
  23. midNode.next=cur;
  24. cur=nextNode;
  25. }
  26.  
  27. //反转之后对前后半段进行比較
  28. slow=head;
  29. fast=midNode.next;
  30. while(fast!=null)
  31. {
  32. if(fast.val!=slow.val)
  33. return false;
  34. slow=slow.next;
  35. fast=fast.next;
  36. }
  37. return true;
  38.  
  39. }

LeetCode234_PalindromeLinkedList (推断是否为回文链表) Java题解的更多相关文章

  1. 领扣(LeetCode)回文链表 个人题解

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

  2. Java判断链表是否为回文链表

    请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 思路:1.通过快慢指针,来遍历链表 ...

  3. Java实现 LeetCode 234 回文链表

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

  4. lintcode 中等题:Palindrome Linked List 回文链表

    题目 回文链表 设计一种方式检查一个链表是否为回文链表. 样例 1->2->1 就是一个回文链表. 挑战 O(n)的时间和O(1)的额外空间. 解题 法一: 再定义一个链表,存放链表反转的 ...

  5. 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 ...

  6. 234 Palindrome Linked List 回文链表

    请检查一个链表是否为回文链表. 进阶:你能在 O(n) 的时间和 O(1) 的额外空间中做到吗? 详见:https://leetcode.com/problems/palindrome-linked- ...

  7. [LC]234题 Linked List Cycle (回文链表)(链表)

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

  8. LeetCode 234:回文链表 Palindrome Linked List

    ​ 请判断一个链表是否为回文链表. Given a singly linked list, determine if it is a palindrome. 示例 1: 输入: 1->2 输出: ...

  9. leetcode面试题 02.06. 回文链表,解题心路

    目录 leetcode面试题 02.06. 回文链表,解题心路 1.题目描述 2.java语言题解一 3.java语言题解二 4.C语言题解一 leetcode面试题 02.06. 回文链表,解题心路 ...

随机推荐

  1. mysql若干问题

    一.Host ip is not allowed to connect to this MySql server 解决方法:这是因为你的账号不允许远程登录,只能在localhost.只要在localh ...

  2. 实用and常用shell命令汇编

    很久没写blog了,基本都在用 github和笔记.现在将一些常用的shell并且很使用的shell用法分享一下: 分行读取,切割,计数: cat product.txt | while read l ...

  3. FCC 基础JavaScript 练习2

    1. 引号不是字符串中唯一的可以被转义字符.下面是常见的转义序列列表: \'  单引号 \" 双引号 \\ 反斜杠符 \n 换行符 \r 回车符 \t 制表符 \b 退格符 \f  换页符 ...

  4. JavaScript(七)数组

    Array类型 1.创建数组 字面量 var arr = [];//不要在低版本的浏览其中创建字面量的时候最后 //一个item后面加 逗号 低版本会 再新建一个空的item 构造函数 var arr ...

  5. Android开发笔记(4)——MainActivity.java文件修改&布局嵌套

    笔记链接:http://www.cnblogs.com/igoslly/p/6805020.html         笔记以开发名为CoffeeOrder的app活动为线索,介绍app如何从功能设计→ ...

  6. interface与抽象类

    抽象类: 定义:在 class 前加了 abstract 关键字且存在抽象方法(在类方法 function 关键字前加了 abstract 关键字)的类 抽象类不能被实例化. 抽象类被继承之后,子类必 ...

  7. HDU_3732_(多重背包)

    Ahui Writes Word Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  8. HDU_1556_线段树区间更新

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  9. Context Switches msdn

    Context Switches  https://msdn.microsoft.com/en-us/library/ms682105(VS.85).aspx The scheduler mainta ...

  10. jmeter接口测试小结

    摘自:http://www.cnblogs.com/houzhizhe/p/6839736.html JMeter做http接口压力测试 测前准备 用JMeter做接口的压测非常方便,在压测之前我们需 ...