题目:
已知两个非降序链表序列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
代码:
#include <map>
#include <set>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
#define LIST_INIT_SIZE 100000
#define LISTINCREMENT 10
#define mod 256
#define lowbit(x) (x&(-x))
#define mem(a,b) memset(a,b,sizeof(a))
#define FRER() freopen("in.txt","r",stdin);
#define FREW() freopen("out.txt","w",stdout);
using namespace std;
const int maxn = 10000 + 7;
typedef struct LNode{
int data;
struct LNode* next;
struct LNode* tail;
}LNode,*LinkList;
void CreateList(LinkList& L){
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
L->tail = NULL;
int n;
int cnt = 0;
while(~scanf("%d",&n)&&n!=-1){
LinkList p = (LinkList)malloc(sizeof(LNode));
p->data = n;
if(cnt==0){
L->next = p;
p->next = NULL;
L->tail = p;
}
else{
LinkList q = L->tail;
q->next = p;
p->next = NULL;
L->tail = p;
}
cnt++;
}
}
void print(LinkList L){
LinkList p = L->next;
if(p==NULL) printf("NULL\n");
else{
int i = 0;
while(p!=NULL){
if(i++) printf(" ");
printf("%d",p->data);
p = p->next;
}
printf("\n");
}
}
void MergeList(LinkList&A,LinkList&B,LinkList&C){
LinkList pa,pb,pc;
pa = A->next;
pb = B->next;
C = (LinkList)malloc(sizeof(LNode));
pc = C;
while(pa&&pb){
if(pa->data<=pb->data){
pc->next = pa;
pc = pa;
pa=pa->next;
}else{
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
pc->next = pa?pa:pb;
}
int main(){
LinkList A,B,C;
CreateList(A);
CreateList(B);
MergeList(A,B,C);
print(C);
}