顺序表的合并
顺序表相当于两个数组的形式,合并时也有有序顺序表的合并和无序顺序表的合并,下面我们会一一讲解。
1.有序顺序表的合并
有序顺序表的合并为了使时间复杂度为O(n),空间复杂度为O(1),所以我们一般会使用三个指针来进行操作,即一个指针指向L1->size-1,设为end1;一个指针指向L2->size-1,设为end2;第三个指针指向将L2的size增加到L1后面之后的size-1的位置,设为end。
若end1<end2,将end2指向的值放到end中,end1不动end2向前移动一个
若end1>end2,将end1指向的值放到end中,end2不懂end1向前移动一个
void Merge(int *num1,int m,int*num2,int n){
int end1=m-1,end2=n-1,end=m+n-1;
while(end1>=0&&end2>=0){
if(num1[end1]<num2[end2]){
num1[end]=num2[end2];
end--,end2--;
}
else{
nums[end]=num1[end1];
end--,end1--;
}
while(end2>=0){
num1[end]=num2[end];
--end,--end2;
}
}
}
2.无序顺序表的合并
无序顺序表只需要两个指针来操作,其时间复杂度为O(n),空间复杂度为O(1)。
void Merge(int num1,int num2,int m,int n){
int end1=m-1,end2=m+n-1;
while(end1>=0&&end2>=0){
num1[end2]=num2[end1];
end1--,end2--;
}
}
链式有序表的合并
由于链表结点之间用指针连接起来,所以合并时不需要另外开辟空间,可以直接利用原来两个表的存储空间,合并过程中只需把两个表中的结点重新连接起来即可。
typedef int LNdataType;
typedef struct ListNode{
struct ListNode*prev;
struct ListNode*next;
LNdataType data;
}LN;
void Merge(LN*L1,LN*L2){
LT*L3=L1->prev;
LT*L4=L2->prev;
L3->next=L2;
L1->prev=L4;
L2->prev=L3;
L4->next=L1;
}