归并的是两个有序线性表!!!
顺序表归并
void mergearray(int a[], int m, int b[], int n,int c[])
{
int i=0, j=0;
int k=0;
while(i<m && j<n)
{
if(a[i] < b[j])
c[k++] = a[i++]; //c[k]=a[i]; k++; i++;
else
c[k++] = b[j++];
}
while(i < m)
c[k++] = a[i++];
while(j < n)
c[k++] = b[j++];
}
链表归并
void merge(LNode* A, LNode* B, LNode *&C)
{
LNode* p = A->next;
LNode* q = B->next;
LNode* r;
C = A;
C->next = nullptr;
delete B;
r = C;
while(p!=nullptr && q!=nullptr)
{
if(p->data <= q->data)
{
r->next = p;
p = p->next;
r = r->next;
}
else
{
r->next = q;
q = q->next;
r = r->next;
}
if(p!=nullptr)
r->next = p;
if(q!=nullptr)
r->next = q;
}
}
归并一条顺序相反的链表:头插法归并得到逆序的
void mergeR(LNode* A, LNode* B, LNode *&C)
{
LNode* p = A->next;
LNode* q = B->next;
LNode* s;
C = A;
C->next = nullptr;
delete B;
while(p!=nullptr && q!=nullptr)
{
if(p->data <= q->data)
{
s = p;
p = p->next;
s->next = C->next;
C->next = s;
}
else
{
s = q;
q = q->next;
s->next = C->next;
C->next = s;
}
}
//剩下的也得头插
while(p!=nullptr)
{
s = p;
p = p->next;
s->next = C->next;
C->next = s;
}
while(q!=nullptr)
{
s = q;
q = q->next;
s->next = C->next;
C->next = s;
}
}