两个有序链表序列的合并

已知两个非降序链表序列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
注意事项:
  • 注意链表创建时是采用的头插法还是尾插法?
  • 是否要进行销毁? 不需要,只需要对Lb所在的结点进行释放即可(并不需要从头到尾销毁)
    此处,区分链表顺序表的销毁操作
题解:
/*
自顶向下
- 思路:- 创建LA与LB   定义一个临时变量num,如果输入元素不为-1,就继续创建节点


- 注意:
- 形式变量不开辟节点只是定义临时变量,只在函数调用期间有效
- 最后对两个表进行销毁操作
- 函数调用方式
- 异常处理{ 返回 -1} 
- OVERFLOW 不可用
- 注意空间释放之后指针指向,避免出现野指针
*/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

#define TRUE        1
#define FALSE       0
#define OK          1
#define ERROR       0
#define INFEASIBLE -1

typedef int  Status;
typedef int  ElemType;

typedef struct LNode
{
	ElemType data;
	struct LNode *next;
}LNode, *LinkList;

Status ListCreate_L(LinkList &L);
Status ListMerge(LinkList &La, LinkList &Lb, LinkList &Lc);
void   LinkPrint(LinkList L);

int main()
{
	LinkList La, Lb, Lc;
	if (ListCreate_L(La) != OK) {
		printf("链表La创建失败!\n");
		return -1;
	}
	if (ListCreate_L(Lb) != OK) {
		printf("链表Lb创建失败!\n");
		return -1;

	}
	if (ListMerge(La, Lb, Lc) != OK) {
		printf("链表合并失败!\n");
		return -1;
	}
	LinkPrint(Lc);
	system("pause");
	return 0;
}
Status ListCreate_L(LinkList &L) {

	L = (LNode*)malloc(sizeof(LNode));
	LNode* p = L;
	L->next = NULL;
	int num = 0;
	scanf("%d", &num);
	while (num != -1) {
		LNode * q = (LNode*)malloc(sizeof(LNode));
		q->data = num;
		p->next = q;
		p=q;
		q->next = NULL;
		scanf("%d", &num);
	}
	return OK;
}
Status ListMerge(LinkList &La, LinkList &Lb, LinkList &Lc) {
	LinkList pa, pb, pc;
	pa = La->next;
	pb = Lb->next;
	Lc = pc = La;
	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;
	free(Lb);
	return OK;
}


void   LinkPrint(LinkList L) {
	LNode* p = L->next;
	for (; p&&p->next; p = p->next) {
		printf("%d ", p->data);
	}
    if (p) {
		printf("%d", p->data);
	}	
	else {
		printf("NULL");
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值