题目:
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL
。
输入样例:
1 3 5 -1
2 4 6 8 10 -1
输出样例:
1 2 3 4 5 6 8 10
答案1:
#include<bits/stdc++.h>
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
LinkList createlist()
{
LinkList L=(LinkList)malloc(sizeof(LinkList));
L->next=NULL;
LinkList q=L;
int e;
while((cin>>e)&&e!=-1)
{
LinkList p=(LinkList)malloc(sizeof(LinkList));
p->next=NULL;
p->data=e;
q->next=p;
q=p;
}
return L;
}
LinkList Merge(LinkList L1,LinkList L2)
{
L1=L1->next;
L2=L2->next;
LinkList L=(LinkList)malloc(sizeof(LinkList));
L->next=NULL;
LinkList q=L;
while(L1||L2)
{
LinkList p=(LinkList)malloc(sizeof(LinkList));
p->next=NULL;
if(L1==NULL||L1->data>L2->data)
{
p->data=L2->data;
L2=L2->next;//不要忘记移动指针
q->next=p;
q=p;
}
else
{
p->data=L1->data;
L1=L1->next;//不要忘记移动指针
q->next=p;
q=p;
}
}
return L;
}
void print(LinkList L3)
{
L3=L3->next;
if(L3==NULL)
cout<<"NULL";
else
{
int f=0;
while(L3)
{
if(f!=0)
cout<<" ";
cout<<L3->data;
L3=L3->next;//不要忘记移动指针
f=1;
}
}
}
int main()
{
LinkList L1,L2,L3;
L1=createlist();
L2=createlist();
L3=Merge(L1,L2);
print(L3);
return 0;
}
答案2:
#include<bits/stdc++.h>
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;
} LNode,*LinkList;
void createlist(LinkList &L)//使用引用则无需特意return L
{
L=(LinkList)malloc(sizeof(LinkList));
L->next=NULL;
LinkList q=L;
int e;
while((cin>>e)&&e!=-1)
{
LinkList p=(LinkList)malloc(sizeof(LinkList));
p->next=NULL;
p->data=e;
q->next=p;
q=p;
}
}
void Merge(LinkList L1,LinkList L2,LinkList &L)//使用引用则无需特意return L
{
L1=L1->next;
L2=L2->next;
L=(LinkList)malloc(sizeof(LinkList));
L->next=NULL;
LinkList q=L;
while(L1||L2)
{
LinkList p=(LinkList)malloc(sizeof(LinkList));
p->next=NULL;
if(L1==NULL||L1->data>L2->data)
{
p->data=L2->data;
L2=L2->next;
q->next=p;
q=p;
}
else
{
p->data=L1->data;
L1=L1->next;
q->next=p;
q=p;
}
}
}
void print(LinkList L3)
{
L3=L3->next;
if(L3==NULL)
cout<<"NULL";
else
{
int f=0;
while(L3)
{
if(f!=0)
cout<<" ";
cout<<L3->data;
L3=L3->next;
f=1;
}
}
}
int main()
{
LinkList L1,L2,L3;
createlist(L1);
createlist(L2);
Merge(L1,L2,L3);
print(L3);
return 0;
}
注意:
1、这里的p应该是指的L的首地址(别忘了指针的本质是地址)
2、而在下面开辟了一个新的节点q,并把它连接上一个节点,然而,这只是形式上的连接,所以让p=q,表示移动地址。
3、在比较大小和输出时不要忘记移动链表指针