王道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); }
注意:
(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
时间: 2024-10-06 14:21:58