链式有序表的合并

题目

合并两个链式递增有序表,并且新链表为递减有序

输入:1 3 5 7

2 4 6

输出:7 6 5 4 3 2 1

解题思路

以链表a的头结点为新链表c的头结点,然后依次比较链表a,b的数据,取小的插入到链表c的头结点后,并且要考虑a,b有一个链表读取到尾节点时,另一个没有到尾结点的情况

解题代码

#include <stdio.h>
#include <stdlib.h>

typedef struct slist
{
	int data;
	struct slist* next;
}SL;

void creat(SL** l, int n)//生成有n个数据的链表
{
	SL* head = (SL*)malloc(sizeof(SL));
	SL* r = (SL*)malloc(sizeof(SL));
	head->next = NULL;
	*l = head;
	r = *l;
	while (n)
	{
		SL* new = (SL*)malloc(sizeof(SL));
		new->next = NULL;
		scanf("%d", &(new->data));
		r->next = new;
		r = new;
		n--;
	}
}
void print(SL* l)//打印链表
{
	SL* p = l->next;
	while (p)
	{
		printf("%d ", p->data);
		p = p->next;
	}
	printf("\n");
}
void merge(SL** la, SL** lb, SL** lc)//合并两个链表
{
	SL* pa, *pb, *pc;
	pa = (*la)->next;
	pb = (*lb)->next;
	*lc = *la;
	pc = *lc;
	if (pa->data < pb->data)//生成新链表头结点
	{
		(* lc)->next = pa;
		pc = pa;
		pa = pa->next;
		pc->next = NULL;
	}
	else
	{
		(*lc)->next = pb;
		pc = pb;
		pb = pb->next;
		pc->next = NULL;
	}
	while (pa || pb)
	{
		if (!pb || (pa && (pa->data < pb->data)))//a,b链表重新连接 并且考虑有一个链表到达尾结点的情况
		{
			pc = pa;
			pa = pa->next;
			pc->next = (*lc)->next;
			(*lc)->next = pc;
		}
		else
		{
			pc = pb;
			pb = pb->next;
			pc->next = (*lc)->next;
			(*lc)->next = pc;
		}
	}
	free(*lb);
}
int main()
{
	SL* a=NULL,*b=NULL,*c=NULL;
	creat(&a, 4);
	creat(&b, 3);
	merge(&a, &b, &c);
	print(c);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值