1、两个递增的有序链表的合并(有重复)
题目描述
分别读入两组递增数据,构建两个递增的有序链表,然后将两个链表合并为一个递增的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中允许有重复的数据。
输入描述
第一行:第一组和第二组数据个数
第二行:第一组的多个递增数据
第三行:第二组的多个递增数据
输出描述
将合并后的链表中数据元素依次输出
样例输入
4 7 3 5 8 11 2 6 8 9 11 15 20
样例输出
2 3 5 6 8 8 9 11 11 15 20
#include<iostream>
#include<fstream>
#include<string>
#include<cstdio>
using namespace std;
#define ERROR 0
typedef struct LNode {
int data; //结点的数据域
struct LNode *next; //结点的指针域
} LNode, *List; //LinkList为指向结构体LNode的指针类型
void InitList(List &L); //创建链表(带头结点)
void ListInput(List &L, int n); //链表数据的输入
void ListOutput(List L); //输出List
//void ListInsert(List &L, int i,int e); //将e插入到List中第i个元素的位置
void ListDelete(List &L, int i); //将删除List中第i个元素
void hebing(List &La,List &Lb,List &Lc);
int main()
{
int n1,n2,n;//定义链表中输入元素的个数
cin>>n1>>n2;
List L1,L2,L3;
InitList(L1);
InitList(L2);
InitList(L3);
ListInput(L1,n1);
ListInput(L2,n2);
hebing(L1,L2,L3);
ListOutput(L3);
return 0;
}
void ListInput(List &L, int n) //链表数据的输入
{
int i=1;
List p, r;
r = L;
while (i<=n) {
p = new LNode;
cin >> p->data;
p->next = NULL;
r->next = p;
r = p;
i++;
}
}
void ListOutput(List L) //输出List
{
List p;
p = L->next;
while (p != NULL) {
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
void InitList(List &L) //创建链表
{
L = new LNode;
L->next = NULL;
}
void ListDelete(List &L, int i) //将删除List中第i个元素
{
List p,q;int j;
p=L;j=0;
while(p->next && (j<i-1))
{
p=p->next;
++j;
}
if(!(p->next)||(j>i-1)) return;
q = p->next;
p->next = q->next;
delete q;
}
void hebing(List &La,List &Lb,List &Lc)
{
List pa,pb,pc,q;
pa=La->next;
pb=Lb->next;
pc=Lc=La;
delete Lb;
while(pa&&pb)
{
if(pa->data<pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else if(pa->data>pb->data)
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
else if(pa->data=pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next;
pc->next=pb;
pc=pb;
pb=pb->next;
}
pc->next=pa?pa:pb;
}
}
2、两个递增的有序链表合并(不允许重复)
题目描述
分别读入两组递增数据,构建两个递增的有序链表,然后将两个链表合并为一个递增的有序链表。
要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中不允许有重复的数据。
输入描述
第一行:第一组和第二组数据个数
第二行:第一组的多个递增数据
第三行:第二组的多个递增数据
输出描述
将合并后的链表中数据元素依次输出
样例输入
4 7 3 5 8 11 2 6 8 9 11 15 20
样例输出
2 3 5 6 8 9 11 15 20
#include<iostream>
#include<fstream>
#include<string>
#include<cstdio>
using namespace std;
#define ERROR 0
typedef struct LNode {
int data; //结点的数据域
struct LNode *next; //结点的指针域
} LNode, *List; //LinkList为指向结构体LNode的指针类型
void InitList(List &L); //创建链表(带头结点)
void ListInput(List &L, int n); //链表数据的输入
void ListOutput(List L); //输出List
//void ListInsert(List &L, int i,int e); //将e插入到List中第i个元素的位置
void ListDelete(List &L, int i); //将删除List中第i个元素
void hebing(List &La,List &Lb,List &Lc);
int main()
{
int n1,n2,n;//定义链表中输入元素的个数
cin>>n1>>n2;
List L1,L2,L3;
InitList(L1);
InitList(L2);
InitList(L3);
ListInput(L1,n1);
ListInput(L2,n2);
hebing(L1,L2,L3);
ListOutput(L3);
return 0;
}
void ListInput(List &L, int n) //链表数据的输入
{
int i=1;
List p, r;
r = L;
while (i<=n) {
p = new LNode;
cin >> p->data;
p->next = NULL;
r->next = p;
r = p;
i++;
}
}
void ListOutput(List L) //输出List
{
List p;
p = L->next;
while (p != NULL) {
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
void InitList(List &L) //创建链表
{
L = new LNode;
L->next = NULL;
}
void ListDelete(List &L, int i) //将删除List中第i个元素
{
List p,q;int j;
p=L;j=0;
while(p->next && (j<i-1))
{
p=p->next;
++j;
}
if(!(p->next)||(j>i-1)) return;
q = p->next;
p->next = q->next;
delete q;
}
void hebing(List &La,List &Lb,List &Lc)
{
List pa,pb,pc,q;
pa=La->next;
pb=Lb->next;
pc=Lc=La;
delete Lb;
while(pa&&pb)
{
if(pa->data<pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else if(pa->data>pb->data)
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
else if(pa->data=pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next;
q=pb;
pb=pb->next;
delete q;
}
pc->next=pa?pa:pb;
}
}