#include <iostream>
using namespace std;
#include <string>
#include <cstring>
#include <queue>
//结点
typedef struct Lnode {
int data;
struct Lnode *next;
}Lnode, *Linklist;
//尾插法建表
void Creatlist(Linklist &L, int e) {
Lnode *p = new Lnode;
p->data = e;
p->next = NULL; //建新节点
Lnode *cur = L;//辅助结点 为了:找到尾节点
while (cur->next != NULL) {
cur = cur->next;
}
cur->next = p;
}
//初始化
void Initlist(Linklist &L){
L = new Lnode;
L->next = NULL;
}
//合并
void Merge(Linklist &L1, Linklist &L2, Linklist &L3) {
Lnode *cur1 = L1->next;
Lnode *cur2 = L2->next;
Lnode *cur3 = L3;
while (cur1 != NULL && cur2 != NULL) {
if (cur1->data < cur2->data) {
cur3->next = cur1; //最小元素入队
cur1 = cur1->next; //指针后移
}
else if (cur1->data == cur2->data){
cur3->next = cur1;
cur1 = cur1->next;
cur2 = cur2->next;
}
else {
cur3->next = cur2;
cur2 = cur2->next;
}
cur3 = cur3->next;
}
cur3->next = cur1 == NULL ? cur2 : cur1; //此时至少有一个表为空 此处判断哪个空
}
//去掉重复元素
void Dele(Linklist &L){
Lnode *p=L->next; //第一个存放元素的结点
while(p!=NULL&&p->next!=NULL){
Lnode *q=p->next;
while(q&&p->data==q->data){
q=q->next;
}
p->next=q; p=p->next;
}
}
//打印
void Print(Linklist &L) {
Lnode *p = L->next;
while (p != NULL) {
printf("%d ", p->data); //打印
p = p->next;
}
printf("\n");
}
int main() {
Linklist L1;
Linklist L2;
Initlist(L1);
Initlist(L2); //处理链表
int n, m; //链表A,B的元素个数
while (scanf("%d %d", &n, &m) != EOF) { //建表且实现多组输入
if (m == 0 && n == 0) break;
for (int i = 0; i < n; i++) { //建链表A
int e;
scanf("%d", &e);
Creatlist(L1, e);
}
for (int j = 0; j < m; j++) { //建链表B
int e;
scanf("%d", &e);
Creatlist(L2, e);
}
Dele(L1);
Dele(L2); //先去重
Lnode *L3 = new Lnode; //新队列 存放合并后元素
Lnode *cur3 = L3;//L3的头结点
Merge(L1, L2, L3);
Print(L3);
Initlist(L1);
Initlist(L2);
Initlist(L3); //一次操作后 置空
}
}
08-11