注意,这题我一直由于没搞清指针和地址的差别而出问题
描述
给定两个递增的整数序列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
3 4
1 5 9
1 2 5 9
0 0
样例输出1
1 2 3 4 5 6 7 8 9 10
1 2 5 9
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
| #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=T->next;//误区 LNode *p3=T;//因为要用next来串联 LNode *p4; while(p1&&p2) { if(p1->data<p2->data) { /*p3=p1; p3=p3->next; p1=p1->next;*///始终要记住p3是一个指针,指向可以变,而每个指针的next才是真正不会变的 p3->next=p1; p3=p1; p1=p1->next; } else if(p1->data>p2->data) { p3->next=p2; p3=p2; p2=p2->next; } else { p3->next=p1; p3=p1; p1=p1->next; p4=p2; p2=p2->next; delete p4; } } p3->next=p1?p1:p2; delete S; } 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; }
|