回文链表

解法一

时间复杂度O(n)、空间复杂度O(n)

遍历链表,转化为数组,通过头尾指针向中间靠拢并比对,判断是否是回文

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {boolean}
*/
var isPalindrome = function (head) {
// 空或者是一个节点,属于回文链表
if (!head || !head.next) return true;
const arr = [];
let cur = head;
while (cur) {
arr.push(cur.val);
cur = cur.next;
}
let left = 0,
right = arr.length - 1;
// 长度奇偶性
while (left <= right) {
if (arr[left++] !== arr[right--]) {
return false;
}
}
return true;
};

解法二

时间复杂度O(n)、空间复杂度O(1)

通过快慢指针,定位到链表的中点,反转后续的链表,并于前面的链表比对,判断是否是回文链表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {boolean}
*/
var isPalindrome = function (head) {
// 空或者是一个节点,属于回文链表
if (!head || !head.next) return true;
// 快慢指针 找中点
let slow = head,
fast = head;
while (fast.next && fast.next.next) {
slow = slow.next;
fast = fast.next.next;
}
// 如果为奇数,slow刚好在中点
// 如果是偶数,slow为中间两个节点的左边节点
// 反转后半部分
let prev = null,
cur = slow.next;
// 断开连接
slow.next = null;
while (cur) {
const next = cur.next;
cur.next = prev;
prev = cur;
cur = next;
}
let p1 = head,
p2 = prev;
while (p1 && p2) {
if (p1.val !== p2.val) {
return false;
}
p1 = p1.next;
p2 = p2.next;
}
// 由于长度的奇偶性
// 如果是奇数,p1比p2多处一个节点
// 如果是偶数,p1和和p2一样长
// 走到这里证明他们是匹配的,return true即可
return true;
};

本站由 ao 使用 Stellar 1.29.1 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。