zoukankan      html  css  js  c++  java
  • 链表 | 将两个递增链表合并为一个递减链表

    王道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语句块都写了,验证时发现可以简写到公共语句块末尾。

  • 相关阅读:
    第05组 Alpha冲刺 (6/6)
    第05组 Alpha冲刺 (5/6)
    第五次作业
    第05组 Alpha冲刺 (4/6)
    第05组 Alpha冲刺 (3/6)
    第05组 Alpha冲刺 (2/6)
    第05组 Alpha冲刺 (1/6)
    第四次作业
    差分约束
    置换群的性质与burnside引理
  • 原文地址:https://www.cnblogs.com/TQCAI/p/8451965.html
Copyright © 2011-2022 走看看