力扣笔记2:双指针

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第二次相遇时,相遇的节点就是环路的开始节点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值