链表 | 将两个递增链表合并为一个递减链表

王道P38T13

主代码:

LinkList merge_desc(LinkList &A,LinkList &B){
    LNode* C=new LNode;
    C->next=NULL;
    LNode *Ap=A->next,*Bp=B->next,*t,*r;
    while(Ap!=NULL && Bp!=NULL){
        if(Ap->data < Bp->data){    //选择Ap 
            t=Ap;
            Ap=Ap->next;
        }else{
            t=Bp;
            Bp=Bp->next;
        }
        t->next=C->next;
        C->next=t;
    }
    if(Ap!=NULL)
        r=Ap;
    else
        r=Bp;
    while(r!=NULL){
        t=r;
        r=r->next;
        t->next=C->next;
        C->next=t;
    }
    return C;
}

完整代码:

#include <cstdio>
#include <stdlib.h>

using namespace std;

typedef struct LNode{
    int data;
    struct LNode* next=NULL; 
    LNode(){    }
    LNode(int x){    
        data=x;
    }
}LNode;

typedef LNode* LinkList;

LinkList  build_list(int * arr,int n){
    int i;
    LinkList L=new LNode;
    LinkList pre=L;
    for(i=0;i<n;i++){
        LinkList p=new LNode(arr[i]);
        pre->next=p;
        pre=p;
    }
    return L;
}

void show_list(LinkList& L){
    LinkList p=L->next;
    while(p){
        printf("%d ",p->data);
        p=p->next;
    }
    puts("");
}

LinkList merge_desc(LinkList &A,LinkList &B){
    LNode* C=new LNode;
    C->next=NULL;
    LNode *Ap=A->next,*Bp=B->next,*t,*r;
    while(Ap!=NULL && Bp!=NULL){
        if(Ap->data < Bp->data){    //选择Ap 
            t=Ap;
            Ap=Ap->next;
        }else{
            t=Bp;
            Bp=Bp->next;
        }
        t->next=C->next;
        C->next=t;
    }
    if(Ap!=NULL)
        r=Ap;
    else
        r=Bp;
    while(r!=NULL){
        t=r;
        r=r->next;
        t->next=C->next;
        C->next=t;
    }
    return C;
}

int main(){
    int A_arr[5]={1,2,3,5,9};
    int B_arr[5]={0,2,2,6,9};
    LinkList A=build_list(A_arr,5);
    LinkList B=build_list(B_arr,5);
    show_list(A);
    show_list(B);    
    LinkList C=merge_desc(A,B);
    show_list(C);
}
 
View Code

注意:

(1)这段代码是我在白纸上手写,然后上机验证的。上机验证发现,小于符号 错写为了 大于符号

    while(Ap!=NULL && Bp!=NULL){
        if(Ap->data < Bp->data){    //选择Ap 
            t=Ap;
            Ap=Ap->next;
        }else{
            t=Bp;
            Bp=Bp->next;
        }
        t->next=C->next;
        C->next=t;
    }

 最后合并的元素应该单调递减,所以用尾插法应该每次选择最小的元素进行尾插。

(2)我在白纸书写紫色代码时,if和else语句块都写了,验证时发现可以简写到公共语句块末尾。

原文地址:https://www.cnblogs.com/TQCAI/p/8451965.html