1. 题目描述

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

示例 1:

  1. 输入: 1->2
  2. 输出: false

示例 2:

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

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

2. 解题思路

字符串拼接:
对于这道题,最直接的思路就是,遍历链表,同时正向和反向拼接链表的节点,最后比较两个拼接出来的字符串是否一样。

这种方式的时间复杂度为O(n),空间复杂度为O(1)

递归遍历:

  • 首先,定义一个全局的指针pointer,其初始值为head,用来正序遍历
  • 然后,调用递归函数,对链表进行逆序遍历,当头部节点为null的时候停止遍历
  • 如果正序遍历的节点值和逆序遍历的节点值都相等,就返回true,否则就返回false

这种方式的时间复杂度为O(n),空间复杂度为O(1)

3. 代码实现

字符串拼接:

  1. /**
  2. * Definition for singly-linked list.
  3. * function ListNode(val) {
  4. * this.val = val;
  5. * this.next = null;
  6. * }
  7. */
  8. /**
  9. * @param {ListNode} head
  10. * @return {boolean}
  11. */
  12. var isPalindrome = function(head) {
  13. let a = ""
  14. let b = ""
  15. while(head){
  16. const nodeVal = head.val
  17. a = a + nodeVal
  18. b = nodeVal + b
  19. head = head.next
  20. }
  21. return a === b
  22. };

递归遍历:

  1. /**
  2. * Definition for singly-linked list.
  3. * function ListNode(val) {
  4. * this.val = val;
  5. * this.next = null;
  6. * }
  7. */
  8. /**
  9. * @param {ListNode} head
  10. * @return {boolean}
  11. */
  12. let pointer
  13. function fn(head) {
  14. if(!head) return true
  15. const res = fn(head.next) && (pointer.val === head.val)
  16. pointer = pointer.next
  17. return res
  18. }
  19. var isPalindrome = function(head) {
  20. pointer = head
  21. return fn(head)
  22. };

4. 提交结果

字符串拼接:
234. 回文链表 - 图1
递归遍历:
234. 回文链表 - 图2