题目描述
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
思路分析
- 方法一:将值复制到数组中后用双指针法
- 方法二:递归
- 方法三:快慢指针
代码实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
bool isPalindrome(ListNode* head) {
vector<int> vec;
ListNode *p = head;
while(p){
vec.push_back(p->val);
p = p->next;
}
int len = vec.size();
for(int i = 0; i < len/2; i++){
if(vec[i] != vec[len-1-i])
return false;
}
return true;
}
};
复杂度
- 时间复杂度O(N)
- 空间复杂度O(N)