题目描述:
已知线性表 LA 和 LB 中的数据元素按值非递减有序排列,现要求将 LA 和 LB 归并为一个新的线性表 LC, 且 LC 中的数据元素仍然按值非递减有序排列。例如,设LA=(3,5,8,11) ,LB=(2,6,8,9,11,15,20) 则
LC=(2,3,6,6,8,8,9,11,11,15,20)
测试样例:
输入:
4 3 5 8 11
7 2 6 8 9 11 15 20
输出:
2 3 5 6 8 8 9 11 11 15 20
#include<iostream>
#include<cstdio>
using namespace std;
struct Node
{
int data;
Node *next;
};
typedef Node* List;
int InitSeqList(List &list)//初始化
{
list=new Node;
list->next=NULL;
return 0;
}
int AddData(List &list,int m)//添加元素到链表中
{
List p=list;
List q=new Node;
q->data=m;
q->next=NULL;
if(p==NULL)
{
p->next=q;
}
else {
while(p->next!=NULL)
{
p=p->next;
}
p->next=q;
}
return 0;
}
int MergeList(List &listA,List &listB,List listC)//合并操作
{
Node* p=listA->next;
Node* q=listB->next;
Node* r=listC;
while(p&&q)
{
if(p->data<q->data)
{
r->next=p;
r=r->next;
p=p->next;
}
else {
r->next=q;
r=r->next;
q=q->next;
}
}
if(q!=NULL)
{
r->next=q;
}
else{
r->next=p;
}
// r->next=NULL;
listA->next=NULL;
listB->next=NULL;
return 0;
}
int PrintSeqList(List &list)//输出
{
Node* p=list->next;
if(p==NULL)
{
cout<<"List is empty"<<endl;
}
else {
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
return 0;
}
int main()
{
// freopen("/config/workspace/answer/test.in","r",stdin);
List listA,listB,listC;
InitSeqList(listA);
InitSeqList(listB);
InitSeqList(listC);
int m,n;
cin >> m;
for(int i=0;i<m;i++){
int v;
cin >> v;
AddData(listA,v);
}
cin >> n;
for(int i=0;i<n;i++){
int v; cin >> v;
AddData(listB,v);
}
MergeList(listA,listB,listC);
PrintSeqList(listC);
return 0;
}
在本题中,我们需要注意在传递参数时需要引用传递而不是按值传递,如果省略了 &
符号,函数参数将不再是引用传递,而是按值传递。这意味着函数内部对参数的修改将只作用于传递进来的参数的副本,不会影响到原始的变量。在这个例子中,如果省略了 &
符号,list
将被视为函数内的一个局部变量,对它的修改不会影响到函数外部传递的原始变量。