234. 回文链表
题意:
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
解题思路:
开始想着创建多个节点来存储,但是不太实际.后来看到大佬说可以用数组做,先把链表转化为数组,之后用双指针就可以完成.
代码:
/**
* 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 *p = head;
int count = 0;
vector<int> v;
while (p != nullptr)
{
v.push_back(p->val);
p = p->next;
}
int left = 0;
int right = v.size() - 1;
while (left <= right)
{
if (v[left] != v[right])
{
return false;
}
left++;
right--;
}
return true;
}
};
运行结果:
总结:
先把链表转化为数组,会使用比较大的空间,但是可以控制时间复杂度在O(n).[遍历链表O(n),判断是否为回文串为O(n). 总O(2n)].所以时间比较快,但因为转化为数组所以空间比较大;