1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| #include<iostream> #define OK 1 using namespace std; typedef struct LNode { int data; struct LNode *next; }LNode,*LinkList; bool InintList(LinkList &L) { L=new LNode; L->next=NULL; return OK; } void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc) { LNode *pa,*pb,*pc,*q;//q是暂时中间体指针 pa=La->next; pb=Lb->next; Lc=La;//用La的节点做Lc的节点,不再创建新的节点。(为了不开辟新的空间来放Lc的头节点) pc=Lc; while(pa&&pb) { if(pa->data<pb->data) { pc->next=pa; pc=pa; pa=pa->next; } else if(pa->data>pb->data) { pc->next=pb; pc=pb; pb=pb->next; } else //相等时,取一个,删除掉一个 ,也就是delete { pc->next=pa; pc=pa; pa=pa->next; q=pb->next; delete pb; pb=q; } } pc->next=pa?pa:pb;//之后一段直接继承。 delete Lb;//释放掉Lb的头节点占用的空间,最后利用全部的空间,没有浪费。 } int main() { int num1,num2; cin>>num1>>num2; LNode *p1,*p2; LNode *r1,*r2; LinkList L;//创建头指针,没有创建头节点 LinkList S; LinkList T; InintList(L);//创建需要用的头节点 ,T不需要 InintList(S); r1=L; r2=S; LNode *p; for(int i=1;i<=num1;i++)//后插法创立链表 { p=new LNode; cin>>p->data; p->next=NULL; r1->next=p; r1=p; } for(int i=1;i<=num2;i++) { p=new LNode; cin>>p->data; p->next=NULL; r2->next=p; r2=p; } MergeList(L,S,T); p=T->next; while(p) { cout<<p->data<<" "; p=p->next; } return 0; }
|