注意:这道题利用了之前的逆序存储(链表)的方法
注意细节,p3指针的应用
描述
给定两个非递减的整数序列A和B,利用链表表示序列A和B,将A和B合并为一个非递增的有序序列C,序列C允许有重复的数据。要求空间复杂度为O(1)。
输入
多组数据,每组数据有三行,第一行为序列A和B的长度n和m,第二行为序列A的n个元素,第三行为序列B的m个元素(元素之间用空格分隔)。n=0且m=0时输入结束。
输出
对于每组数据输出一行,为合并后的序列,每个数据之间用空格分隔。
样例输入1 复制
5 5
1 3 5 7 9
2 4 6 8 10
5 6
1 2 2 3 5
2 4 6 8 10 12
0 0
样例输出1
10 9 8 7 6 5 4 3 2 1
12 10 8 6 5 4 3 2 2 2 1
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 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
| #include<iostream> #include<cstdio> #include<string> #include<algorithm> #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 &L,LinkList &S,LinkList &T) { LNode *p1=L->next; LNode *p2=S->next; LNode *p3; while(p1&&p2) { if(p1->data<p2->data) { p3=p1->next; p1->next=T->next; T->next=p1; p1=p3; } else if(p1->data>p2->data) { p3=p2->next; p2->next=T->next; T->next=p2; p2=p3; } else { p3=p1->next; p1->next=T->next; T->next=p1; p1=p3; p3=p2->next; p2->next=T->next; T->next=p2; p2=p3; } } while(p1) { p3=p1->next; p1->next=T->next; T->next=p1; p1=p3; } while(p2) { p3=p2->next; p2->next=T->next; T->next=p2; p2=p3; } } int main() { LNode *p1; LNode *p2; int num1,num2; while(cin>>num1>>num2&&!(num1==0&&num2==0)) { LinkList L; LinkList S; LinkList T; InintList(L); InintList(S); InintList(T); L->next=new LNode; S->next=new LNode; LNode *p1=L->next; LNode *pre1=L; LNode *p2=S->next; LNode *pre2=S; for(int i=1;i<=num1;i++) { cin>>p1->data; p1->next=new LNode; p1=p1->next; pre1=pre1->next; } pre1->next=NULL; for(int i=1;i<=num2;i++) { cin>>p2->data; p2->next=new LNode; p2=p2->next; pre2=pre2->next; } pre2->next=NULL; mergelist(L,S,T); LNode *p=T->next; cout<<p->data; p=p->next; while(p) { cout<<" "<<p->data; p=p->next; } cout<<endl; } return 0; }
|