LeetCode探索(75):234-回文链表

119 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情

题目

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false

示例 1:

img

输入:head = [1,2,2,1]
输出:true

示例 2:

img

输入:head = [1,2]
输出:false

提示:

  • 链表中节点数目在范围[1, 10^5]
  • 0 <= Node.val <= 9

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

思考

本题难度简单,回顾了链表的相关内容。

首先是读懂题意。单链表的大致意思是,该链表的结构看起来像数组那样,是一个接一个手拉手连接起来的。

为了判断给出的链表是否是回文链表,我们可以依次比较首位两个元素是否相等,如果相等则继续判断,不等则说明不是回文链表。为了方便比较,我们可以将链表的数值转存为一个数组,然后依次遍历数组,比较首尾的两个数值是否相等即可。也就是双指针的原理。

遍历链表和双指针判断的时间复杂度均为O(n),因此,总的时间复杂度是O(n),n 指的是链表的元素个数。空间复杂度是O(n)

解答

方法一:双指针法

var isPalindrome = function(head) {
  const vals = []
  while (head !== null) {
    vals.push(head.val)
    head = head.next
  }
  for (let i = 0, j = vals.length - 1; i < j; ++i, --j) {
    if (vals[i] !== vals[j]) {
      return false
    }
  }
  return true
}

// 执行用时:156 ms, 在所有 JavaScript 提交中击败了60.34%的用户
// 内存消耗:70.6 MB, 在所有 JavaScript 提交中击败了37.16%的用户
// 通过测试用例:86 / 86

复杂度分析:

  • 时间复杂度:O(n),其中 n 指的是链表的元素个数。
  • 空间复杂度:O(n),其中 n 指的是链表的元素个数,我们使用了一个数组列表存放链表的元素值。

参考