将两个递增的有序链表合并为一个递减的有序链表
【问题描述】将两个递增的有序链表合并为一个递减的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间,表中不允许有重复的数据。
【输入形式】元素个数 元素
【输出形式】
【样例输入】
3
2 4 6
5
1 2 5 7 9
【样例输出】
9 7 6 5 4 2 1
#include<stdlib.h>
#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef struct LNode
{
ElemType data;//结点的数据域
struct LNode *next;//结点的指针域
}LNode,*LinkList;//LinkList为指向结构体LNode的指针类型
//将两个降序的表按降序合并起来
void merlist(LinkList &LA,LinkList &LB,LinkList &LC)
{LinkList pa,pb,pc;
pa=LA->next;
pb=LB->next;
LC=LA;
pc=LC;
while(pa && pb){
if(pa->data>pb->data){
pc->next =pa;
pc=pa;
pa=pa->next;
}
else if(pa->data==pb->data){
pc->next =pa;
pc=pa;
pb=pb->next;
pa=pa->next;
}
else
{ pc->next =pb;
pc=pb;
pb=pb->next;
}
}
pc->next=pa?pa:pb; //将非空表的剩余段插入到pc所指节点之后
delete LB;
}
//降序的函数
void paixu(LinkList &L,int n)
{int i,j;
LinkList p,q;
p=L;
ElemType temp;
int flag=1;
i=1;
while(i<=n-1 && flag){
q=L->next;
p=q->next;
flag=0;
j=1;
while(j<=n-i){
if(q->data< p->data){
temp= q->data;
q->data = p->data;
p->data=temp;
flag=1;
}
q=p;
p=p->next;
j++;
}
i++;
}
}
int main(){
//先创建单链表
LinkList L1,L2,L3;
L1 = new LNode;
L1->next=NULL;
LinkList p,r,y;
r=L1;
L2 = new LNode;
L2->next=NULL;
LinkList q,s;
s=L2;
//输入
int n1;
cin>>n1;
for(int i=1;i<=n1;i++)
{
p=new LNode;
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;
}
int n2;
cin>>n2;
for(int i=1;i<=n2;i++)
{
q=new LNode;
cin>>q->data;
q->next=NULL;
s->next=q;
s=q;
}
//调用函数
paixu(L1,n1); //将表降序排列
paixu(L2,n2); //将表降序排列
merlist(L1,L2,L3);
//输出
y=L3->next;
while(y)
{cout<<y->data<<" ";
y=y->next;
}
return 0;
}