两个有序列表合并
问题描述:
将两个递增的有序链表合并为一个递增的的有序链表。要求结果链表仍然使用原来两个链表的存储空间,不另外占用其他的的存储空间。表中不允许有重复的数据。
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 typedef struct Lnode 5 { 6 int data; 7 struct Lnode *next; 8 }Lnode,*LinkList;
9 void creatList(LinkList &L); 10 void traverse(LinkList L); 11 void mergeList(LinkList &La,LinkList &Lb);
12 int main() 13 { 14 LinkList La,Lb; 15 creatList(La); //创建链表La 16 creatList(Lb); //创建链表Lb 17 18 traverse(La); 19 traverse(Lb); 20 mergeList(La,Lb); //两个链表合并 21 22 traverse(La); 23 24 return 0; 25 } 26 27 void creatList(LinkList &L) //创建链表,前面提过,不再赘述 28 { 29 L = (LinkList)malloc(sizeof(Lnode)); 30 L->next = NULL; 31 32 LinkList ptail = L; 33 printf("input the length:\n"); 34 scanf("%d",&L->data); 35 36 for(int i=1;i<=L->data;i++) 37 { 38 LinkList pnew = (LinkList)malloc(sizeof(Lnode)); 39 printf("input the %d data:\n",i); 40 scanf("%d",&pnew->data); 41 42 ptail->next = pnew; 43 ptail = pnew; 44 45 ptail->next = NULL; 46 } 47 48 } 49 50 void traverse(LinkList L) //遍历链表,不再赘述 51 { 52 LinkList p = L; 53 while(p->next!=NULL) 54 { 55 printf("%d ",p->next->data); 56 p = p->next; 57 } 58 printf("\n"); 59 } 60 //合并链表,思路是声明一个指针pc指向La,然后对比La与Lb中值的大小,pc一直指向较小数值的指针,直到一个链表为空时结束,接着将pc指向余下的链表,最后释放Lb的头指针 61 void mergeList(LinkList &La,LinkList &Lb) //合并链表 62 { 63 LinkList Lc; 64 LinkList pa = La->next; 65 LinkList pb = Lb->next; 66 67 Lc = La; 68 LinkList pc = Lc; 69 70 while(pa&&pb) 71 { 72 if(pa->data<pb->data) 73 { 74 pc->next = pa; 75 pc = pa; 76 pa = pa->next; 77 }else if(pa->data = pb->data) 78 { 79 LinkList q = pb; 80 pc->next = pa; 81 pc = pa; 82 pa = pa->next; 83 pb = pb->next; 84 85 free(q); 86 87 }else 88 { 89 pc->next = pb; 90 pc = pb; 91 pb = pb->next; 92 } 93 } 94 95 pc->next = pa?pa:pb; //将余下的代码接到pc后 96 97 free(Lb); 98 }