class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int l=0,r=numbers.size()-1,sum;
while(l<r){
sum=numbers[l]+numbers[r];
if(sum==target){
break;
}
if(sum<target){
++l;
}else{
--r;
}
}
return vector<int>{l+1,r+1};
}
};
题解:设定两个指针在首尾,同时向中间移动,两个指针指向元素的和为给定值就返回,小于给定值就把左边指针右移一位,使当前的和增加一点,小于同理。
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int p1=m-1,p2=n-1;
int tail=m+n-1;
int cur;
while(p1>=0||p2>=0){
if(p1==-1){
cur=nums2[p2--];
}else if(p2==-1){
cur=nums1[p1--];
}else if(nums1[p1]>nums2[p2]){
cur=nums1[p1--];
}else{
cur=nums2[p2--];
}
nums1[tail--]=cur;
}
}
};
题解:双指针,p1(以示例1为例)指向3, p2指向6,tail指向最后一个0,比较p1和p2,最一开始p1指向的3比6大,就把6挪到nums1的最后一个位置,也就是把最后一个0替换成6,同时p1指针向左移动一位,接着比较,直到p1和p2都为负为止。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode *fast=head,*slow=head;
do{
if(!fast||!fast->next){
return nullptr;
}
fast=fast->next->next;
slow=slow->next;
}while(fast!=slow);
fast=head;
while(fast!=slow){
fast=fast->next;
slow=slow->next;
}
return fast;
}
};
题解:两个指针(fast和slow)都指向最一开始的节点,如果fast走到尽头说明没有环路,如果fast一直走下去说明有环路,且一定有某个时刻fast和slow相遇,当第一次相遇时,将fast移到链表的开头,然后让fast和slow每次都前进一步,当slow和fast第二次相遇时,相遇的节点就是环路的开始节点