晚上时间不够刷一个简单的练练手,跳过14题后面补上,奥里给!!!
题目
编写一个函数,检查输入的链表是否是回文的。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
解析
详见代码,一目了然,利用vector
数组进行旋转,比较是否相等即可。
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool isPalindrome(ListNode* head) {
ListNode* current = head;
std::vector<int> vec1;
std::vector<int> vec2;
while(current)
{
vec1.push_back(current->val);
current = current->next;
}
vec2 = vec1;
reverse(vec1.begin(),vec1.end()); //反转
return vec1 == vec2;
}
};
//hmtian @2020/7/20
快慢指针解法
个人觉得代码没我的简单…
----------》出处
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool isPalindrome(ListNode* head) {
if(head==nullptr||head->next==nullptr){
return true;
}
ListNode*fast=head;
ListNode*slow=head;
ListNode*pre=NULL;
while(fast&&fast->next){
slow=slow->next;
fast=fast->next->next;
}
while(slow){
ListNode*tmp=slow->next;
slow->next=pre;
pre=slow;
slow=tmp;
}
while(head&&pre){
if(head->val!=pre->val){
return false;
}
head=head->next;
pre=pre->next;
}
return true;
}
};