leetcode 234. 回文链表
问题描述
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
代码
这道题先找到中点,再把后半部分反转,再进行比较,反转部分参考网站.其中找中点部分如果链表为[1,2,2,1]slow为第一个2,如果链表为[1,2,3,2,1]slow为3,因此要反转的都是slow的下一个元素(slow=slow->next).
/**
* 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|| !head->next)return true;
ListNode* fast = head,*slow = head,*tmp,*tmp2 = head;
while(fast->next && fast->next->next)
{
slow = slow->next;
fast = fast->next->next;
}
tmp = reverse(slow,NULL);
slow = slow->next;
while(tmp && tmp2)
{
if(tmp2->val==tmp->val)
tmp2=tmp2->next,
tmp=tmp->next;
else
return false;
}
return true;
}
ListNode* reverse(ListNode* begin,ListNode* end)
{
ListNode* a = new ListNode(0),*b = begin,*c;
while(b != end)
{
c = b->next;
b->next = a->next;
a->next = b;
b = c;
}
return a->next;
}
};
结果:
执行用时 :24 ms, 在所有 C++ 提交中击败了68.87%的用户
内存消耗 :15.8 MB, 在所有 C++ 提交中击败了5.23%的用户