给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
示例 1:
输入:head = [1,2,2,1]
输出:true
示例 2:
输入:head = [1,2]
输出:false
提示:
链表中节点数目在范围[1, 10^5] 内
0 <= Node.val <= 9
进阶:你能否用O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
遍历得到数组然后再判断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
class Solution { public: bool isPalindrome(ListNode* head) { vector<int> values; while (head){ values.push_back(head->val); head = head->next; } for (int i = 0, j = values.size()-1; i < j; i++, j--){ if (values[i] != values[j]){ return false; } } return true; } };
|
翻转链表后半段,然后在比较
空间复杂度可以降低到O(1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
|
class Solution { public: bool isPalindrome(ListNode* head) { if (!head){ return true; } ListNode* mid = findMid(head); ListNode* newMid = reverseList(mid->next);
ListNode* p1 = head; ListNode* p2 = newMid; while (p2){ if (p1->val != p2->val){ return false; } p1 = p1->next; p2 = p2->next; } mid->next = reverseList(newMid); return true; }
ListNode* reverseList(ListNode* head) { ListNode* prev = nullptr; ListNode* cur = head; while (cur != nullptr){ head = cur->next; cur->next = prev; prev = cur; cur = head; } return prev; }
ListNode* findMid(ListNode* head){ ListNode* slow = head; ListNode* fast = head; while (fast->next && fast->next->next){ slow = slow->next; fast = fast->next->next; } return slow; } };
|