简单题
1.移动0
283. 移动零 - 力扣(LeetCode)
刚开始没看到非零子串的顺序不变:
// if(nums.size() == 1){// return;// }// //所有 0 移动到数组的末尾//同时保持非零元素的相对顺序。// int n = nums.size();// int notZero = n-1;//// int zero = 0;// while(zero<notZero){// while(notZero==0){// notZero--;// }// while(zero!=0){// zero++;// }// swap(nums[zero],nums[notZero]);// zero++;// notZero--;// }
之后还是【1,0】测试用例没过
void moveZeroes(vector<int>& nums) {int i = 0;int j =0;while(i<=j){while(i<nums.size() && nums[i]!=0){i++;}while(j<nums.size() && nums[j]==0){j++;}if(i<nums.size() && j<nums.size()){cout<<i<<j<<endl;swap(nums[i],nums[j]);}else{break;}i++;j++;}}
开始觉得双指针的思路确实不应该这样
首先是一个for一直遍历,然后另一个偶尔改变
我希望维护一个第一个0的位置,一个第一个非0 的位置【必须在0位置之后】
【这一点建议在举例子的时候考虑到,比如2,3,0,9】
我决定遍历第一个0的位置
第一个非0 的位置取max(i+1,j)
class Solution {
public:void moveZeroes(vector<int>& nums) {int nz = 0;for (int z = 0; z < nums.size(); z++) {if(nums[z]!=0){//continue;}// cout<<z<<endl;nz = max(nz,z+1);while(nz<nums.size() && nums[nz]==0){nz++;}if(nz<nums.size()){swap(nums[nz],nums[z]);}}
}
};
2.相交链表
while(pa &&pb)//原来想简单了,觉得pa和pb应该同时到终点,毕竟挪动了abs(asize-bsize)
咦,那为什么会出现这种情况呢
3.回文链表
1.经典while中p没写p = p->next;
2.链表一般的边界是考虑head==nullptr和head->next ==nullptr;
3.
翻转链表中,最后的头是pre,以及pre=cur要放在前面,防止cur = nex覆盖了pre
4.合并两个有序链表
卡住了
本来想l2插入到l1,不断比较l1中cur,next和cur2大小关系
还不如类似新建一个链表,不是新建嗷
class Solution {
public:ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {ListNode dummy(-1000);ListNode* tail = &dummy;while (list1 && list2) {if (list1->val < list2->val) {tail->next = list1;list1 = list1->next;} else {tail->next = list2;list2 = list2->next;}tail = tail->next;}// 连接剩余链表tail->next = list1 ? list1 : list2;return dummy.next;}
};