. - 力扣(LeetCode)兄弟们,今天给大家带来一道oj题,题目的链接在最上方,铁铁可以先自己思考一下然后再来看这篇文章。
首先我们创建三个变量(可以理解为指针)--- l1,l2,l3。其中l1指向的是nums1数组中的最后一个有效数字,注意这里是有效数字,在本例中也就是指向3。l2指向的是nums2的最后一个位置的数字。l3指向的是l1的最后一个位置,注意这里的最后一个是实际的nums1所能容纳的数据的最后一个。l1 = m-1;l2 = n-1;l3 = m+n-1;(数组的下标从0开始)接下来我们只需要将l1和l2所对应的位置的数据进行比较,哪一个较大,那么就把它的数据赋給l3的位置,同时它们也要减小,也就是这一段代码:
显而易见,这里需要一个循环以反复赋值,循环的条件是l1和l2需要都为正数,因为只要有一个为负数也就意味着那一个数组的元素已经从尾部到头部遍历完全了。循环的条件是:
while(l1>=0 && l2>=0)
循环的代码完整代码是:
那么跳出循环的条件也很简单:要么是l1变为负数要么是l2变为负数,那么有没有可能是同时变为负数呢?我们回归代码本身,在循环内部,每一次要么是l1--,要么是l2--,只能执行一个,因此不可能同时变为负数。接下来针对跳出循环时是l1变为负数还是l2变为负数来进行讨论。
1:如果是l1变为负数,此时l2还有值没有放进nums1中,并且由于数组nums1是非递减的,因此只需要将nums2中剩下的前几个数据分别放入nums1的前几个空间就可以了,注意这里的空间大小,nums1能存储m+n个数据,正好是nums1和nums2中的有效数据的和。代码如下:
2:如果是l2先变为负数呢?我们可以发现l1的数据已经排列好了,不需要再动了。也就不需要进行处理即可。
完整的代码如下:
最后我们来反思一下这个代码:代码的时间复杂度是O(m+n),空间复杂度为O(1).