234.回文链表

一、题目描述

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

示例 1:

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

示例 2:

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

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

二、题解

1.算法描述

  • 遍历+双指针
  • 快慢指针+翻转链表

2.个人分析

  • 我使用的是第一种算法,首先,遍历整个链表,将所有元素存到数组中,然后使用头尾指针判断数组即可。

    但是这种算法不是最优的,时空复杂度均为O(n)

  • 第二种算法,首先使用快慢指针找到链表的中点(做过),再将后半段链表翻转,并与前半段链表比较即可。

3.代码

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
bool isPalindrome(struct ListNode *head)
{
if (head == NULL)
return true;
int len = 0;
struct ListNode *p = head;
while (p != NULL)
{
len++;
p = p->next;
}
p = head;

int *data = (int *)malloc(len * sizeof(int));
int m = 0;
while (p != NULL)
{
data[m++] = p->val;
p = p->next;
}

int i = 0, j = len - 1;
while (i <= j)
{
if (data[i] == data[j])
{
i++;
j--;
}
else
return false;
}
return true;
}