Description
根据输入分别创建两个(递增)有序单链表(有头结点),并将其合并为一个新的(递增)有序链表。
Input
第一行:输入第一个链表的长度n(1<n<1000)
第二行:输入第一个链表的元素值(整数)
第三行:输入第二个链表的长度k(1<k<1000)
第四行:输入第二个链表的元素值(整数),#表示结束标志。
Output
输出合并后新链表的元素值,用空格间隔。注:最后一个输出的整数后面没有空格和换行符。
Sample Input
5
12 23 38 56 67
6
7 10 25 56 6878 #
Sample Output
7 1012 23 25 38 56 67 68 78
#include <bits/stdc++.h>
using namespace std;
typedef struct Lnode
{
int data, length;
struct Lnode *next;
} Lnode, *Linklist;
void initL(Linklist &L)
{
L = new Lnode;
L->next = NULL;
}
void creatL(Linklist &L)
{ // 尾插创建
int n;
cin >> n;
L->length = n;
Lnode *p = new Lnode;
p = L;
for (int i = 0; i < n; i++)
{
Lnode *q = new Lnode;
cin >> q->data;
p->next = q;
q->next = NULL;
p = q;
}
}
void ADD(Linklist L, Linklist T, Linklist &S)
{ // 新的链表,不会损坏原来链表
S->length = L->length + T->length;
Lnode *p = new Lnode;
Lnode *q = new Lnode;
Lnode *m = new Lnode;
p = L->next;
q = T->next;
m = S;
while (p && q)
{ // 都为尾插
if (p->data < q->data)
{
Lnode *n = new Lnode;
n->data = p->data;
m->next = n;
n->next = NULL;
m = n;
p = p->next;
}
else if (p->data > q->data)
{
Lnode *n = new Lnode;
n->data = q->data;
m->next = n;
n->next = NULL;
m = n;
q = q->next;
}
else
{
Lnode *n = new Lnode;
n->data = p->data;
m->next = n;
n->next = NULL;
m = n;
p = p->next;
q = q->next;
S->length--;
}
}
while (p)
{ // 把没跑完的链表连上
Lnode *n = new Lnode;
n->data = p->data;
m->next = n;
n->next = NULL;
m = n;
p = p->next;
}
while (q)
{
Lnode *n = new Lnode;
n->data = q->data;
m->next = n;
n->next = NULL;
m = n;
q = q->next;
}
}
void ADDpro(Linklist &L, Linklist &T, Linklist &S)
{ // 新的链表,会损坏原来的两个
Lnode *p = new Lnode;
Lnode *q = new Lnode;
Lnode *m = new Lnode;
p = L->next;
q = T->next;
S = m = L;
while (p && q)
{ // 直接在原来两个链表的基础上勾链
if (p->data < q->data)
{
m->next = p;
m = p;
p = p->next;
}
else if (p->data > q->data)
{
m->next = q;
m = q;
q = q->next;
}
else
{
m->next = p;
m = p;
p = p->next;
q = q->next;
S->length--;
}
}
m->next = p ? p : q; // 谁不空就续上谁
S->length = L->length + T->length;
}
void printL(Linklist L)
{
int m = 0;
Lnode *n = new Lnode;
n = L->next;
for (int i = 0; i < L->length; i++)
{
cout << n->data;
if (m != L->length - 1)
cout << " ";
m++;
n = n->next;
}
}
int main()
{
Linklist L, T, S;
initL(L);
initL(T);
initL(S);
creatL(L);
creatL(T);
char c;
cin >> c;
ADDpro(L, T, S);
printL(S);
return 0;
}