版权声明:欢迎转载,但转载时请注明原文地址 https://blog.csdn.net/weixin_42110638/article/details/85208916
7-90 两个有序链表序列的合并 (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
答案:
单链表实现
#include<iostream>
#include <bits/stdc++.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Elemtype;
typedef int Status;
typedef struct LNode
{
Elemtype data;
struct LNode *next;
} LNode,*LinkList;
Status List_Create(LinkList &CL)
{
LinkList rear;
CL = (LinkList)malloc(sizeof(LNode));
if(!CL)
exit(OVERFLOW);
CL->next = NULL;
rear = CL;// //初始时头结点为尾节点,rear指向尾巴节点
//rear->next = NULL;
int t;
while(scanf("%d",&t))
{
if(t!=-1)
{
LinkList p = (LinkList)malloc(sizeof(LNode));
p->data = t;
rear->next = p;
rear = p;
}
else
break;
}
rear->next = NULL;
return 0;
}
Status List_Merge(LinkList &L1,LinkList &L2,LinkList &L3)
{
LinkList pa = L1->next,pb = L2->next,pc;
L3 = pc = L1;
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 = pc->next;
}
pc->next = pa?pa:pb;
return OK;
}
void List_Print(LinkList &CL)
{
LinkList p = CL->next;
bool flag = true;
if(!p)
printf("NULL");
else
{
while(p)
{
if(flag)
{
printf("%d",p->data);
flag = false;
}
else
printf(" %d",p->data);
p = p->next;
}
}
}
int main()
{
LinkList A,B,C;
List_Create(A);
List_Create(B);
List_Merge(A,B,C);
List_Print(C);
}