题目
判断一个单向链表是否是回文链表,要求在O(n)的时间复杂度,O(1)的空间复杂度。
分析
方法一:利用栈先进后出的性质,将链表的前半段压入栈中,在逐个弹出与链表后半段比较,时间复杂度O(n),但需要n/2的栈空间,空间复杂度为O(n);
方法二:翻转链表法,将链表后半段原地翻转,再将前半段、后半段依次比较,判断是否相等,时间复杂度为O(n),空间复杂度为O(1),满足题目要求。
代码
/**
* 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==NULL || head->next==NULL){
return true;
}
ListNode* quick = head;
ListNode* slow = head;
while(quick!=NULL && quick->next!=NULL){
slow = slow->next;
quick = quick->next->next;
}
ListNode* start = NULL;
ListNode* tmp = NULL;
while(slow != NULL){
tmp = slow->next;
slow->next = start;
start = slow;
slow = tmp;
}
while(start != NULL){
if(head->val != start->val){
return false;
}
head = head->next;
start = start->next;
}
return true;
}
};