题意
给一个单链表,判断其是否对称。比如1->2->2->1是对称的链表,而1->2不对称。
暴力解法
判断数组是否对称很简单,使用两个指针分别指向首尾,朝着中间遍历即可。所以第一个想法是遍历链表,把链表中的元素保存在数据组,再判断数组是否对称。时间复杂度O(n),空间复杂度O(n)。
O(1)空间复杂度的解法
对称链表的后半部分反转后和前半部分是相同的,而找到链表的后半部分以及反转链表的空间复杂度都是O(1),时间复杂度是O(n),因此我们得到了一个常量空间复杂度的算法。
使用快慢指针找到链表的中点
反转链表的后半部分
再比较前半部分和后半部分是否相等
代码
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/class Solution {public:bool isPalindrome(ListNode* head) {ListNode* slow = head, *fast = head;while (fast && fast->next) {fast = fast->next->next;slow = slow->next;}if (fast)slow = slow->next;slow = reverse(slow);while (slow) {if (slow->val != head->val)return false;slow = slow->next;head = head->next;}return true;}ListNode* reverse(ListNode* root) {ListNode* prev = nullptr;while (root) {ListNode* next = root->next;root->next = prev;prev = root;root = next;}return prev;}};
文章转载自后端魔法书,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




