鏈表 | 將兩個遞增鏈表合並為一個遞減鏈表
阿新 • • 發佈:2018-02-17
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 LView Code=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); }
註意:
(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語句塊都寫了,驗證時發現可以簡寫到公共語句塊末尾。
鏈表 | 將兩個遞增鏈表合並為一個遞減鏈表