题目:
我的代码实现:
#include<iostream>
using namespace std;
#define ElemType int
typedef struct LNode
{
ElemType data;
struct LNode* next;
}LNode,*LinkList;
void CreateList_R(LinkList &L)//尾插法创建单链表
{
LNode *p,*r;
int n;
L=new LNode;
L->next=NULL;
r=L;
cin>>n;
while(n!=9999)
{
p=new LNode;
p->data=n;
p->next=NULL;
r->next=p;
r=p;
cin>>n;
}
}
LinkList Combine_and_Upside(LinkList &A,LinkList &B)//本题解答
{
LNode *p1,*p2,*q1,*q2;
LinkList C;
C=new LNode;
C->next=NULL;
p1=A,p2=B,q1=A->next,q2=B->next;
while(p1->next&&p2->next)
{
if(q1->data>q2->data)
{
p1->next=q1->next;
q1->next=C->next;
C->next=q1;
q1=p1->next;
}
else if(q2->data>=q1->data)
{
if(q2->data==q1->data)
{
p1->next=q1->next;
delete q1;
q1=p1->next;
}
p2->next=q2->next;
q2->next=C->next;
C->next=q2;
q2=p2->next;
}
}
while(p1->next)
{
q1=p1->next;
p1->next=q1->next;
q1->next=C->next;
C->next=q1;
q1=p1->next;
}
while(p2->next)
{
q2=p2->next;
p2->next=q2->next;
q2->next=C->next;
C->next=q2;
q2=p2->next;
}
delete A;
delete B;
return C;
}
void ShowList(LinkList &L)//显示自己的操作结果
{
LNode *k=L->next;
printf("打印整个操作后的单链表的情况:\n");
while(k){
printf(" %d ",k->data);
k=k->next;
}
printf("\n");
}
void DestroyList(LinkList &L)//销毁单链表
{
LNode *P=L;
while(L)
{
L=L->next;
printf("\n成功删除%d\n",P->data);
delete P;
P=L;
}
}
int main()
{
LinkList A,B; //定义两个递减有序的单链表
LinkList C;
printf("\n创建递减有序单链表A:\n");
CreateList_R(A);
printf("\n创建递减有序单链表B:\n");
CreateList_R(B);
C=Combine_and_Upside(A,B);//本题解答:将A、B合并成一个递增有序的单链表
ShowList(C);//展示新的单链表
DestroyList(C);//销毁单链表
}
算法思想:在两个链表的头部各放置指针,然后同时开始向前移动并不断比较所指向结点中数据的大小。发现较大的数据就将其所在原结点从链表中取出并利用“头插法”将其放在新的头结点的后面。这样不断下去直到两个链表中至少有一个被删除完毕,再将剩下的链表的剩余数据的原结点倒插入新的头结点的后面。