很多时候代码需要有一些巧思,需要"故意犯错",利用错误,放任错误,来简化很多我们需要专门考虑的问题。
比如:
题目一
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
这道题是一道很简单的链表反转,
这是精简版的代码,我们让p访问到链表最后一个节点的后一位,我们不去返回p
/**
* 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:
ListNode* reverseList(ListNode* head) {
ListNode * pre=nullptr,* p=head,* tmp;
while(p){
tmp=p->next;
p->next=pre;
pre=p;
p=tmp;
}
return pre;
}
};
这是我自己的代码:
/**
* 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:
ListNode* reverseList(ListNode* head) {
ListNode * pre=nullptr,* p=head,* tmp;
while(p && p->next){
tmp=p->next;
p->next=pre;
pre=p;
p=tmp;
}
if(p)
p->next=pre;
return p;
}
};
就是固定思维,想要返回p,殊不知,pre就是我们的答案。
题目二:平方数组
https://leetcode.cn/problems/squares-of-a-sorted-array/
使用双指针,那么什么时候结束循环呢,如果考虑l<r这种情况,那么最终肯定还剩下一个元素,我们需要特殊考虑,再加入到新数组中,但是如果我们使用l<=r,那么最终剩下一个元素的时候,也会进入循环,在循环中搞定。可能折半查找,使用左闭右闭时,循环条件r<=l也是有这方面考虑。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> ans(nums.size());
int i=0,j=nums.size()-1,k=nums.size()-1;
while(i<=j){
if(nums[i]*nums[i]>nums[j]*nums[j]){
ans[k--]=nums[i]*nums[i];
i++;
}else{
ans[k--]=nums[j]*nums[j];
j--;
}
}
return ans;
}
};