编写一个函数,检查输入的链表是否是回文的。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
执行用时 :
44 ms, 在所有 C++ 提交中击败了7.92%的用户
内存消耗 :
17 MB, 在所有 C++ 提交中击败了100.00%的用户
/**
* 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) {
deque<int> ans;
while(head){//第一次循环,整体数据写入deque容器
ans.push_back(head->val);
head = head->next;
}
if(ans.size() == 0)
return true;
else{
int left ,right;
//下面是第二次循环
while(ans.size()>=2){//小于1时可以直接判断是回文了
left = ans.front();
ans.pop_front();
right = ans.back();
ans.pop_back();
if(left!=right){
return false;//不是回文,返回false
}
}
return true;
}
}
};
最坏情况对该链表数据循环整体循环2次才能够得出结果,(即2n次)
所以:
时间复杂度为O(N),
空间复杂度为 O(1)。
后记:
还是要多多使用容器,掌握多一点STL的技术。这一次由于对pop.front() 和 pop_back() 不熟悉,还以为能够得到pop出来的返回值,没想到这两个函数是void类型的,故还是乖乖的去查了使用手册。
用front() 和 back() 代替即可。