线性结构1 两个有序链表序列的合并

PTA - - 线性结构

本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。

L1和L2是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Merge要将L1和L2合并为一个非递减的整数序列。应直接使用原序列中的结点,返回归并后的带头结点的链表头指针。

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

typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
	ElementType Data;
	PtrToNode   Next;
};
typedef PtrToNode List;

List Read(); /* 细节在此不表 */
void Print(List L); /* 细节在此不表;空链表将输出NULL */

List Merge(List L1, List L2);

int main()
{
	List L1, L2, L;
	L1 = Read();
	L2 = Read();
	L = Merge(L1, L2);
	Print(L);
	Print(L1);
	Print(L2);
	return 0;
}

/* 你的代码将被嵌在这里 */


List Read()    //利用尾插法建立初始有序链表
{
	int x;
	scanf("%d",&x);

	List  L = (List)malloc(sizeof(struct Node));   //申请一个头结点,并置空指针
	L->Next = NULL;                                  

	if (x) {

		List r = L;                               //中间变量节点

		for (int i = 0; i < x; i++)
		{
			List nwe = (List)malloc(sizeof(struct Node));
			scanf("%d", &nwe->Data);

			r->Next = nwe;

			r = nwe;
		}

		r->Next = NULL;	
	
	}

	return L;
}




void Print(List L) {

	if (L->Next) {

		List r = L;

		while (r->Next)
		{
			r = r->Next;
			printf("%d", r->Data);
		}
	
	
	}

	else {
	
		printf("NULL");
	}

	printf("\n");


}




List Merge(List L1, List L2) {

	List  P1, P2, P;

	List L = (List)malloc(sizeof(struct Node ));

	P1 = L1->Next ;
	P2 = L2->Next;

	P = L;
	while (P1 && P2) {
	

		if (P1->Data >= P2->Data) {

			P->Next = P2;
			P = P2;
			P2 = P2->Next;

		}

		else {
			P->Next = P1;
			P = P1;
			P1 = P1->Next;

		}
	
	}

	P ->Next= P1 ? P1 : P2;
	L1->Next = NULL;
	L2 ->Next = NULL;
	return L;


}



尾插法
即将节点依次接入链表末尾,称为尾插法
在这里插入代码片

头插法
即每个节点都插入到头部称为头插法。
如:已知链表L,头插法插入A,B,C则有下列形式
L->A
L->B->A
L->C->B->A
我们可以发现,运用头插法建立链表,顺序是相反的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值