C++ 7-2 两个有序链表合并(新表不含重复元素) (20 分)
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。 要求S3中没有重复元素。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出合并后新的非降序链表,要求链表中没有重复元素。数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。
输入样例:
在这里给出一组输入。例如:
1 3 3 5 8 -1
2 3 4 6 8 10 -1
输出样例:
在这里给出相应的输出。例如:
1 2 3 4 5 6 8 10
我的代码:
#include <iostream>
using namespace std;
typedef struct Node{
int data;
Node* next;
}Node,*LinkList;
int main(){
LinkList S1 = new Node,S2 = new Node ,S3 = new Node;
S1->next = NULL;
S2->next = NULL;
S3->next = NULL;
int x;
Node* p = S1;
while(cin>>x&&x!=-1)
{
Node* s = new Node;
s->data = x;
s->next = NULL;
p->next = s;
p = p->next;
}
p = l2;
while(cin>>x&&x!=-1){
Node* s = new Node;
s->data = x ;
s->next = NULL;
p->next = s;
p = p->next;
}
p = S1->next;
Node* p2 = S2->next;
Node* p3 = S3;
while(p&&p2){
if(p->data <= p2->data){//取小的
if(p->data != p3->data){//比较是否l3与l1有重复的元素
p3->next = p;
p3 = p;
p = p->next;
p3->next = NULL;
}else{//若重复相等则跳过下一个节点
p = p->next;
}
}else{
if(p2->data != p3->data){//比较是否l3与l2有重复的元素
p3->next = p2;
p3 = p2;
p2 = p2->next;
p3->next = NULL;
}else{//若重复相等则跳过下一个节点
p2 = p2->next;
}
}
}
//64-88行代码作用是防止因L1与L2长度不同而漏并元素;即若去掉此段代码,则只能比较相同长度的链表,检测所给输入样例时,运行结果会少了一个10.
if(p){
while (p) {
if(p->data!=p3->data){
p3->next = p;
p3 = p;
p = p->next;
p3->next = NULL;
}else{
p = p->next;
}
}
}
else if(p2){
while (p2) {
if((p2->data!=p3->data)){
p3->next = p2;
p3 = p2;
p2 = p2->next;
p3->next = NULL;//防止最后一个重复
}else{
p2 = p2->next;
}
}
}
p3 = S3;
p3 = p3->next;
if(p3==NULL){
cout<<"NULL";
}else{
while(p3!=NULL){
if(p3->next == NULL)
cout<<p3->data;
else
cout<<p3->data<<" ";
p3 = p3->next;
}
}
return 0;
}
本代码参考于网上的大佬。本人添加了一点注释。