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

  • 相关阅读:
    494. Target Sum 添加标点符号求和
    636. Exclusive Time of Functions 进程的执行时间
    714. Best Time to Buy and Sell Stock with Transaction Fee有交易费的买卖股票
    377. Combination Sum IV 返回符合目标和的组数
    325. Maximum Size Subarray Sum Equals k 和等于k的最长子数组
    275. H-Index II 递增排序后的论文引用量
    274. H-Index论文引用量
    RabbitMQ学习之HelloWorld(1)
    java之struts2的数据处理
    java之struts2的action的创建方式
  • 原文地址:https://www.cnblogs.com/TQCAI/p/8451965.html
Copyright © 2011-2022 走看看