将两个递增有序序列合并为另一个递增有序序列。
输入样例:
1 3
2
1 3 5
3 1
1 3 5
2
5 3
1 5 6 7 8
2 3 4
3 3
1 2 3
1 2 3
3 3
1 2 3
4 5 6
3 3
4 5 6
1 2 3
0 0
输出样例:
1 2 3 5
1 2 3 5
1 2 3 4 5 6 7 8
1 2 3
1 2 3 4 5 6
1 2 3 4 5 6
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode {
int data;
struct LNode *next;
} LNode, *LinkList;
LinkList ListInit();
void ListDestroy(LinkList *head);
void ListTailInsert(LinkList head, int x);
void ListShow(LinkList head);
void ListMerge(LinkList A, LinkList B);
int main() {
int m, n;
while (scanf("%d %d%*c", &m, &n) && m && n) {
LinkList A = ListInit();
LinkList B = ListInit();
int x;
for (int i = 0; i < m; i++) {
scanf("%d%*c", &x);
ListTailInsert(A, x);
}
for (int i = 0; i < n; i++) {
scanf("%d%*c", &x);
ListTailInsert(B, x);
}
ListMerge(A, B);
ListShow(A);
ListDestroy(&A);
ListDestroy(&B);
}
return 0;
}
LinkList ListInit() {
LinkList head = (LinkList) malloc(sizeof(LNode));
head->data = 0;
head->next = NULL;
return head;
}
void ListDestroy(LinkList *head) {
LNode *tmp;
while (*head) {
tmp = *head;
*head = (*head)->next;
free(tmp);
}
}
void ListTailInsert(LinkList head, int x) {
LNode *newNode = (LNode *) malloc(sizeof(LNode)), *tail = head;
newNode->data = x;
newNode->next = NULL;
while (tail->next) tail = tail->next;
tail->next = newNode;
}
void ListShow(LinkList head) {
for (LNode *cursor = head->next; cursor; cursor = cursor->next) {
printf("%d%c", cursor->data, cursor->next ? 32 : 10);
}
}
void ListMerge(LinkList A, LinkList B) {
LNode *curA = A, *curB = B, *tmp;
while (curA->next && curB->next) {
if (curA->next->data < curB->next->data) {
curA = curA->next;
} else if (curA->next->data > curB->next->data) {
/*将curB->next结点插入到curA->next位置*/
tmp = curB->next->next;
curB->next->next = curA->next;
curA->next = curB->next;
curB->next = tmp;
curA = curA->next;
} else {
curA = curA->next;
curB = curB->next;
}
}
if (curB->next) {
curA->next = curB->next;
curB->next = NULL;
}
}