2020-10-23 第4题
题目来源:leetcode 每日一题
234. 回文链表
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
看到是一个简单题,没考虑怎么写时空复杂度会低,直接采用最简单的方法写。我的思路是:这个主要是对称,会有奇数和偶数的区别。但实际上写的时候发现好像没区别,因为长度除以2以后奇数并不会判断中间那个数字,所以奇偶都一样,只要两边对称的数字相同就行,也就是i和node.size()-1-i相同就行。
写的时候我不知道能不能直接对链表进行操作,保险起见还是将链表中的节点进行导出,存放到vector中了。然后判断对称位置value是否相同。如果不同直接return false。
写的时候我觉得我的逻辑必然没有问题,事实证明确实没有,因为题目很简单,但是一开始还是出错,因为在取前半部分字符的时候for循环的终止条件写为(node.size()-1)/2,当时考虑如果只有2个字符那么终止条件是i<0.5,能正常进循环,但实际情况是除法默认取整,也就是i<0,循环就进不了。思考过后我认为条件可以直接写成node.size()/2,因为这样计算4和5字符要判断的都是两组字符(默认取整),符合我的想法,所以就这么改了,然后正确。
代码如下:
/**
* 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) {
if(!head)return true;
ListNode* cur=head;
vector<ListNode*>node;
int i,flag=0;
while(cur)55jee y55,j h
{
node.push_back(cur);
cur=cur->next;
//cout<<node.size()<<endl;
}
for(i=0;i<node.size()/2;i++)
{
// cout<<node[i]<<' '<<node[i+1]<<endl;
if(node[i]->val!=node[node.size()-1-i]->val)
{
//cout<<'?'<<endl;
return false;
}
}
return true;
}
};
运行结果如下
一会儿学习别人的解题思路: