具体思想就是,得到两个已经升序排列的链表后,依次用指针读取链表内的数据,比较大小,将较小的加入新的链表,移动指针,直到读取完两个链表的内容。
#include<cstdio>
#include<iostream>
using namespace std;
typedef struct Node *PtrToNode;
struct Node{
int data;
PtrToNode Next;};
typedef PtrToNode List;
void create(PtrToNode &L){//创建一个单链表
int n;
PtrToNode p,r;
L=(PtrToNode)malloc(sizeof(struct Node));
L->Next=NULL;
p=L;
while((scanf("%d",&n))!=EOF){
r=(PtrToNode)malloc(sizeof(struct Node));
r->data=n;
p->Next=r;
p=p->Next;
}
r->Next=NULL;
}
void printlist(PtrToNode L){//输出单链表
PtrToNode p;
p=L;
while(p->Next!=NULL){
p=p->Next;
cout<<p->data<<' ';
}
}
void process(PtrToNode L1,PtrToNode L2){//对两个链表进行处理
PtrToNode L3=(PtrToNode)malloc(sizeof(struct Node));
L3->Next=NULL;
PtrToNode p,q,r,s;
p=L1->Next;q=L2->Next;r=L3;
while((p!=NULL)&&(q!=NULL)){
if((p->data)<=(q->data)){//因链表已经升序排列因此进行两个链表的数据依次比较大小
r->Next=p;
p=p->Next;
r=r->Next;
}
else{
r->Next=q;
q=q->Next;
r=r->Next;
}
}
if(p==NULL){//可能有个链表未能读取完
r->Next=q;
}
else if(q==NULL){
r->Next=p;
}
printlist(L3);
}
int main(){
PtrToNode L1,L2;
PtrToNode p;
int i;
cout<<"请输入第一个链表:(输入结束回车后输入Ctrl+z)vs可能需要输入多次"<<endl;
create(L1);
cout<<"请输入第二个链表:(输入结束回车后输入Ctrl+z)vs可能需要输入多次"<<endl;
create(L2);
process(L1,L2);
return 0;
}
以上是我的想法,如有逻辑问题或疏漏欢迎批评指针qaq