题目描述
不写博客怕把刷过的题给忘了,写一篇博客当作自己的刷题笔记
分析
- 题目要求用O(n)的时间复杂度和O(1)的空间复杂度,显然不能用数组将链表的值记录下来再判断了
- 先用快慢指针(快2慢1)找到链表的中间位置,然后把前半部分的链表就地逆置
- 逆置完再比较两个链表的值是否相等
bool isPalindrome(ListNode* head) {
if(head == NULL || head->next == NULL) return true; //只有一个结点时
ListNode* fast = head;
ListNode* slow = head;
while(fast->next != NULL && fast->next->next != NULL){
fast = fast->next->next;
slow = slow->next;
}
//判断链表结点的奇偶
//是奇数则逆置完成后的链表长度不一样,后面需要统一
bool isOdd = true;
if(fast->next == NULL) isOdd = false;
//后半部分的链表头
ListNode* head2 = slow->next;
//就地逆置前半部分
ListNode* pre = NULL;
ListNode* cur = head;
ListNode* temp = cur->next;
while(cur != head2){
cur->next = pre;
pre = cur;
cur = temp;
temp = temp->next;
}
//前半部分的链表头
ListNode* head1 = pre;
//统一两个链表的长度
if(!isOdd) head1 = head1->next;
while(head1 != NULL && head2 != NULL){
if(head1->val != head2->val){
return false;//值不相等,非回文链表
}
head1 = head1->next;
head2 = head2->next;
}
//比较完成,所有结点数据相等,返回true
return true;
}
以前都是直接找题解,这次是自己想的办法提交的,感觉解这个题写得代码有点长了。还是得多刷题