线性表二路归并

1.顺序表的归并

void mergearray(int a[],int m,int b[],int n,int c[]){
    int i=0,j=0,k=0;
    while(i<m && j<n){
        if(a[i] < b[j]){
            c[k++]=a[i++];
        }else{
            c[k++]=b[j++];
        }
    }
    while(i<m){
        c[k++]=a[i++];
    }
    while(j<n){
        c[k++]=b[j++];
    }
} 

2.单链表的归并

//归并顺序(类似尾插法) 
void mergeLinkList(LNode *head1,LNode *head2,LNode *&head3){
    LNode *p=head1->next,*q=head2->next;
    LNode *r;
    head3=head1;
    head3->next=NULL;
    free(head2);
    r=head3;
    while(p!=NULL && q!=NULL){
        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!=NULL){
        r->next=p;
    }
    if(q!=NULL){
        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=NULL;
    free(B);
    while(p!=NULL && q!=NULL){
        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!=NULL){
        s=p;
        p=p->next;
        s->next=C->next;
        C->next=s;
    }
    while(q!=NULL){
        s=q;
        q=q->next;
        s->next=C->next;
        C->next=s;
    }
    
} 

猜你喜欢

转载自www.cnblogs.com/jcahsy/p/13173845.html
今日推荐