P234 回文链表


题目

image-20210623144238676

分析

  • 使用一边遍历一边递归的方法
  • 性能非常糟糕😰,堆栈开销很大
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
private ListNode frontNode;
public boolean isPalindrome(ListNode head) {
frontNode = head;
return check(head);
}

public boolean check(ListNode node){
if(node!=null){
if(!check(node.next)){
return false;
}
if(frontNode.val!=node.val){
return false;
}
frontNode = frontNode.next;
}
return true;

}
}
  • 可以将后半部分链表翻转,然后比较翻转后半部分链表和前半部分链表

题解

  • 此处引用官方的题解
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
class Solution {
public boolean isPalindrome(ListNode head) {
if (head == null) {
return true;
}

// 找到前半部分链表的尾节点并反转后半部分链表
ListNode firstHalfEnd = endOfFirstHalf(head);
ListNode secondHalfStart = reverseList(firstHalfEnd.next);

// 判断是否回文
ListNode p1 = head;
ListNode p2 = secondHalfStart;
boolean result = true;
while (result && p2 != null) {
if (p1.val != p2.val) {
result = false;
}
p1 = p1.next;
p2 = p2.next;
}

// 还原链表并返回结果
firstHalfEnd.next = reverseList(secondHalfStart);
return result;
}

private ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode nextTemp = curr.next;
curr.next = prev;
prev = curr;
curr = nextTemp;
}
return prev;
}

private ListNode endOfFirstHalf(ListNode head) {
ListNode fast = head;
ListNode slow = head;
while (fast.next != null && fast.next.next != null) {
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
}
时间复杂度 空间复杂度
O(n) O(1)

一点屁话

  • 这真的是简单题吗?

← Prev P118 杨辉三角 | 剑指 Offer 15. 二进制中1的个数 Next →