1. 程式人生 > >PTA 水題 兩個有序連結串列序列的合併

PTA 水題 兩個有序連結串列序列的合併

7-51 兩個有序連結串列序列的合併(20 分)

已知兩個非降序連結串列序列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

水題

注意資料規模,以及兩個空的時候輸出NULL

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <vector>
#include <sstream>
#include <map>
#include <queue>
#include <stack>
#include <cstring>
#include <set>
#include <cmath>
#define INF 1000000

using namespace std;
int a[1000005];
int b[1000005];
int ans[2000005];
int lena;
int lenb;


int main()
{
    int i=0;
    int x=0;
    while(1)
    {
        scanf("%d",&x);
        if(x==-1) break;
        a[i++]=x;
    }
    lena=i;
    i=0;
    while(1)
    {
        scanf("%d",&x);
        if(x==-1) break;
        b[i++]=x;
    }
    lenb=i;
    int j=0;
    i=0;
    int k=0;
    if(lena==0 && lenb==0)
    {
        printf("NULL\n");
        return 0;
    }

    while(i<lena && j<lenb)
    {
        if(a[i]<b[j])
        {
            ans[k++]=a[i++];
        }
        else
        {
            ans[k++]=b[j++];
        }
    }
    while(i<lena)
    {
        ans[k++]=a[i++];
    }
    while(j<lenb)
    {
        ans[k++]=b[j++];
    }
    for(int i=0;i<k;i++)
    {
        if(i==0) printf("%d",ans[i]);
        else printf(" %d",ans[i]);
    }
    printf("\n");


    return 0;
}