class Solution {
public:
    int findMedianinTwoSortedAray(vector<int>& arr1, vector<int>& arr2) {
        if(arr1.size() == 1) return min(arr1[0], arr2[0]); //若总数为2直接返回较小数即可
        int l1 = 0, r1 = arr1.size() - 1, l2 = 0, r2 = arr2.size() - 1; //四个指针分别指向两个数组的首尾
        int mid1 = 0, mid2 = 0, even = 0; //用于记录每轮中间的指针和当前子区间是否为偶数
        while(l1 < r1) {
            even = (r1 - l1) % 2; //偶数为1,奇数为0
            mid1 = (l1 + r1) >> 1; //求第一个数组中间指针
            mid2 = (l2 + r2) >> 1; //求第二个数组中间指针
            if(arr1[mid1] == arr2[mid2]) return arr1[mid1]; //若是子区间中间值相等,则直接返回数值
            else if(arr1[mid1] < arr2[mid2]) { //当一个子区间的中值小于另一个区间的中值时
                l1 = mid1 + even; //我们取较小中值区间的右半部分,注意长度为偶数的子区间中值后一位才是右半部分的起点
                r2 = mid2; //取较大中值区间的左半部分
            }
            else { //以下同理
                l2 = mid2 + even;
                r1 = mid1;
            }
        }
        return min(arr1[l1], arr2[l2]); //此时两个指针指向排序后中间的两个数,只需返回其中较小的数
    }
};