一、题目
二、方案
确定数组列表是否为回文很简单,我们可以使用双指针法来比较两端的元素,并向中间移动。一个指针从起点向中间移动,另一个指针从终点向中间移动。这需要 O(n) 的时间,因为访问每个元素的时间是 O(1),而有 n 个元素要访问。
然后,直接在链表上操作并不简单,因为不论是正向访问还是反向访问都不是 O(1)。而将链表的值复制到数组列表中是 O(n),因此最简单的方法就是将链表的值复制到数组列表中,再使用双指针法判断。
bool isPalindrome(ListNode* head) {
vector<int> v;
while(head){
v.push_back(head->val);
head = head->next;
}
// 判断是否回文
for(int i=0; i<v.size()/2; ++i){
if(v[i] != v[v.size()-1-i]){
return false;
}
}
return true;
}
其他方案:将所有节点值入栈,然后一一出栈并比较
class Solution {
public:
bool isPalindrome(ListNode* head) {
stack<int> s;
ListNode *p = head;
while(p){
s.push(p->val);
p = p->next;
}
p = head;
while(p){
if(p->val != s.top()){
return false;
}
s.pop();
p = p->next;
}
return true;
}
};
参考: