大家好,我是苏貝,本篇博客带大家刷题,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
1
合并两个有序数组
1.使用额外的数组(从前往后)
先创建一个元素个数为m+n的数组tmp,从索引为0开始,判断nums1和nums2数组元素的大小,较小的元素放入数组tmp中,然后较小元素属于的数组索引+1。如示例1中:1<2,将nums1中的1放入tmp数组中。nums1数组的索引+1,即再判断2和2的大小,2==2,将nums1中的2放入tmp数组中。nums1数组的索引+1,即再判断3和2的大小,3>2,将nums2中的2放入tmp数组中。nums2数组的索引+1,即再判断3和5的大小,3<5,将nums1中的3放入tmp数组中。nums1数组的索引+1,此时nums1中没有有效数据了,所以直接将nums2的剩余元素放入tmp数组中
解题思路:创建变量i1和i2,i1是nums1的下标,i2是nums2的下标,当i1<m并且i2<n时,进入while循环,nums1和nums2的元素较小的放在tmp数组中。当i1=m或者i2=n时,退出循环。当i1<m时,将nums1剩余元素直接放在tmp数组中;当i2<n时,将nums2剩余元素直接放在tmp数组中。最后将tmp数组复制给nums1数组
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
int *tmp=(int*)malloc(sizeof(int)*(m+n));
int i1=0;
int i2=0;
int i=0;
while(i1<m && i2<n)
{
if(nums1[i1]<=nums2[i2])
{
tmp[i++]=nums1[i1++];
}
else
{
tmp[i++]=nums2[i2++];
}
}
while(i1<m)
{
tmp[i++]=nums1[i1++];
}
while(i2<n)
{
tmp[i++]=nums2[i2++];
}
for(int j=0;j<m+n;j++)
{
nums1[j]=tmp[j];
}
}
2.原地合并(从后往前)
上一个方法是先将小的元素放进数组,再放入大的元素。那这个原地合并方法就是将较大的元素先放入最后位置,再找出较大元素放入倒数第二个位置……
解题思路:创建变量i1和i2,i1是nums1最后位置的下标,i2是nums2最后位置的下标,当i1和i2都>=0时,进入while循环,将较大元素从后往前放入nums1数组中。当i1<0或者i2<0时,退出循环。当i1<0即i2>=0时,将nums2的剩余元素按从后往前的顺序放入nums1中;当i2<0即i1>=0时,不用再进行操作
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
int i1=m-1;
int i2=n-1;
int i=m+n-1;
while(i1>=0&&i2>=0)
{
if(nums1[i1]>=nums2[i2])
{
nums1[i--]=nums1[i1--];
}
else
{
nums1[i--]=nums2[i2--];
}
}
while(i2>=0)
{
nums1[i--]=nums2[i2--];
}
}
2
合并两个有序链表
思路:
思路很简单,就是将逐次比较,较小的放在前面。注意:当两个链表的一个走完后最终链接时,只要将tail->next=不为NULL的链表即可
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
if(list1==NULL)
return list2;
if(list2==NULL)
return list1;
//list1和list2都不为NULL
struct ListNode* i1=list1;
struct ListNode* i2=list2;
struct ListNode* newhead=NULL;
struct ListNode* tail=NULL;
while(i1&&i2)
{
if(i1->val<=i2->val)
{
if(tail==NULL)
{
tail=newhead=i1;
}
else
{
tail->next=i1;
tail=tail->next;
}
i1=i1->next;
}
else
{
if(tail==NULL)
{
tail=newhead=i2;
}
else
{
tail->next=i2;
tail=tail->next;
}
i2=i2->next;
}
}
if(i1)
tail->next=i1;
if(i2)
tail->next=i2;
return newhead;
}
好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️