题目描述
将两个链表表示的递增整数序列合并为一个非递减的整数序列
本题是附加代码模式,以下代码会自动附加在同学们提交的代码后面,请同学们在提交的时候注释掉自己的main函数和链表输出函数。
附加代码如下:
void PrintList(const List &list)
{
List p=list;
while(p->next!=NULL){
p=p->next;
cout << p->data << " ";
}
cout << endl;
}
int main(){
int m,n;
cin >> m >> n;
List listA, listB;
InitList(listA); // 初始化单链表
InitList(listB); // 初始化单链表
for(int i=0;i<m;i++){
int v;cin >> v;
AddNode(listA,v); // 在单链表的末尾增加节点
}
for(int i=0;i<n;i++){
int v; cin >> v;
AddNode(listB, v);
}
List listC = MergeList(listA,listB); //合并两个单链表
PrintList(listC); // 输出单链表
DestroyList(listA); // 销毁单链表
DestroyList(listB); // 销毁单链表
DestroyList(listC); // 销毁单链表
return 0;
}
输入格式
输入三行,第一行代表两个链表长度,第二三行分别表示两个链表表示的递增序列
输出格式
输出合并后的序列
输入样例
3 5
1 3 5
2 4 6 8 10
输出样例
1 2 3 4 5 6 8 10
数据范围与提示
//单链表的结构体定义和相应的操作函数如下所示:
#include <iostream>
using namespace std;
struct Node
{
int data;
Node* next;
};
typedef Node* List;
void InitList(List &list)
{
}
void DestroyList(List &list)
{
}
void AddNode(List &list,int data)
{
}
List MergeList(List &listA,List &listB)
{
List listC;
return listC;
}
代码展示
本题主要思想:用两个指针遍历处理,处理过的往后移动。
注意:总有一个表元素先处理完,此时应把剩余的元素直接接在新表的末尾。
#include<iostream>
#include<cstdio>
using namespace std;
struct Node{
int data;
Node *next;
};
typedef Node* List;
int InitList(List& list){
list=new Node;
list->next=NULL;
return 0;
}
int DestroyList(List& list){
List p1,p2;
p1=list;
p2=list;
while(p1!=NULL){
p1=p1->next;
free(p2);
p2=p1;
}
return 0;
}
int AddNode(List& list,int v){
List head=list;
List p1=list;
List p2=new Node;
p2->data=v;
p2->next=NULL;
if(head==NULL){
head->next=p2;
}
else{
while(p1->next!=NULL){
p1=p1->next;
}
p1->next=p2;
}
return 0;
}
List MergeList(List &listA,List &listB){
List listC;
InitList(listC);
List p1=listA->next,p2=listB->next;
List p3=listC;
while(p1!=NULL&&p2!=NULL){
if(p1->data < p2->data){
List p=new Node;
p->data=p1->data;
p->next=NULL;
p3->next=p;
p3=p3->next;
p1=p1->next;
}
else if(p1->data > p2->data){
List p=new Node;
p->data=p2->data;
p->next=NULL;
p3->next=p;
p3=p3->next;
p2=p2->next;
}
else{
List pp1=new Node;
pp1->data=p1->data;
pp1->next=NULL;
p3->next=pp1;
p3=p3->next;
p1=p1->next;
List pp2=new Node;
pp2->data=p2->data;
pp2->next=NULL;
p3->next=pp2;
p3=p3->next;
p2=p2->next;
}
}//将符合条件的结点添加到listC中
//若有其中一个list元素先被取完
//则将另一个list中所有元素接到listC后
if(p1==NULL){
for(;p2!=NULL;p2=p2->next){
List p=new Node;
p->data=p2->data;
p->next=NULL;
p3->next=p;
p3=p3->next;
}
}
else if(p2==NULL){
for(;p1!=NULL;p1=p1->next){
List p=new Node;
p->data=p1->data;
p->next=NULL;
p3->next=p;
p3=p3->next;
}
}
return listC;
}
//以下为附加代码
// void PrintList(const List& list){
// List p=list;
// while(p->next!=NULL){
// p=p->next;
// cout<<p->data<<' ';
// }
// cout<<endl;
// }
// int main(){
// int m,n;
// cin>>m>>n;
// List listA,listB;
// InitList(listA);
// InitList(listB);
// for(int i=0;i<m;i++){
// int v;cin>>v;
// AddNode(listA,v);
// }
// for(int i=0;i<n;i++){
// int v;cin>>v;
// AddNode(listB,v);
// }
// List listC=MergeList(listA,listB);
// // PrintList(listA);
// // PrintList(listB);
// PrintList(listC);
// DestroyList(listA);
// DestroyList(listB);
// DestroyList(listC);
// return 0;
// }