1. 程式人生 > >鏈表 | 將兩個遞增鏈表合並為一個遞減鏈表

鏈表 | 將兩個遞增鏈表合並為一個遞減鏈表

tro nod 大於 div 分享 arr closed merge 鏈表

王道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語句塊都寫了,驗證時發現可以簡寫到公共語句塊末尾。

鏈表 | 將兩個遞增鏈表合並為一個遞減鏈表