合并两个有序链表,合并后依然有序

第一步:找到合并后链表的第一个结点

两个有序链表中,把第一个结点数据小的作为合并后链表的第一个结点

第二步:哪个结点的数据小哪个结点就尾插到合并后的链表中

比较两个链表中结点数据大小,数据小的结点尾插到合并后的链表中,同时该结点向后走,直到两个链表中有一个为空。

第三步:将仍有结点的链表尾插到合并后的链表中

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

typedef int DataType;

typedef struct SListNode
{
	DataType data;
	struct SListNode* pNext; 
}SListNode;


//申请新空间
SListNode *BuyNewNode( DataType data)
{
	SListNode *pNewNode = (SListNode *)malloc(sizeof(SListNode));
	assert(pNewNode);
	pNewNode->data = data;
	pNewNode->pNext = NULL;
	return pNewNode;
}


//初始化
void SListInit(SListNode **ppFirst)
{
	*ppFirst = NULL;
}


//打印函数
void SListNodePrint(SListNode **ppFirst)
{
	SListNode *pNode = NULL;
	for (pNode = *ppFirst; pNode != NULL; pNode = pNode->pNext)
	{
		printf("%d ->", pNode->data);
	}
	printf(" NULL\n");
}


//尾插
void SListPushBack(SListNode **ppFirst, DataType data)
{
	SListNode *pNode = BuyNewNode(data);
	SListNode *pTail = *ppFirst;
	if (*ppFirst == NULL)
	{
		*ppFirst = pNode;
		return;
	}
	while (pTail->pNext)
	{
		pTail = pTail->pNext;
	}
	pTail->pNext = pNode;
}


//合并两个有序链表,合并后依然有序
SListNode *MergeSList(SListNode *list1, SListNode *list2)
{
	
	SListNode *list = NULL;
	SListNode *pTail; 
	if (list1 == NULL)
		return list2;
	if (list2 == NULL)
		return list1;

	if (list1->data < list2->data)
	{
		list = list1;
		list1 = list1->pNext;
	}
	if (list2->data < list1->data)
	{
		list = list2;
		list2 = list2->pNext;
	}
	pTail = list;
	while (list1 && list2)
	{
		if (list1->data < list2->data)
		{
			pTail->pNext = list1;
			pTail = list1;
			list1 = list1->pNext;
		}
		if (list2->data < list1->data)
		{
			pTail->pNext = list2;
			pTail = list2;
			list2 = list2->pNext;
		}
	}
	if (list1)
	{
		pTail->pNext = list1;
	}
	if (list2)
	{
		pTail->pNext = list2;
	}
	return list;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值