合并两链表

本文探讨了如何合并两个有序链表,重点在于处理链表为空、比较节点大小以及长度不一致的情况。通过比较首节点元素,可以有效地减少内存开销。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

合并两链表,在对两有序链表应该做较详尽的分析

1.一链表为空则合并结果为另一链表。

2.合并过程中的大小比较。(为减少开辟节点所占空间,可以比较两链表第一个节点元素大小,并将头节点直接赋给新节点)

3.两链表长度不同时的处理。

List.h

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int DataType;
typedef struct LinkNode
{
	DataType _data;
	struct LinkNode *_next;
}LinkNode,*pLinkNode;
typedef struct LinkList
{
	LinkNode *pHead;
}*pLinkList;
 
void Init_List(pLinkNode plist);
void Push_List(pLinkNode plist,DataType data);
void print_List(pLinkNode plist);
void free_List(pLinkNode plist);
pLinkNode Merge_List(pLinkNode plist1, pLinkNode plist2);




Merge.h

#include"List.h"

void Init_List(pLinkNode plist)
{
	    assert(plist);
		plist->_next = NULL;
}
pLinkNode creatNode(DataType data)
{
	pLinkNode newNode = (pLinkNode)malloc(sizeof(LinkNode));
	if (newNode == NULL)
	{
		printf("out of memory");
		exit(EXIT_FAILURE);
	}
	newNode->_data = data;
	newNode->_next = NULL;
	return newNode;
}
void Push_List(pLinkNode plist, DataType data)
{
	pLinkNode newNode=creatNode(data);
	if (NULL == plist->_next)    //空链表
		plist->_next = newNode;
	else
	while (plist->_next )
	{
		plist = plist->_next;
	}
	plist->_next = newNode;
}

void free_List(pLinkNode plist)
{
	assert(plist);
	if (NULL == plist->_next)   //空链表
		return;
	else if (NULL == plist->_next->_next)  //只有一个节点
	{
		free(plist->_next);
	}
	else
	while (plist)
	{
		free(plist);
		plist = plist->_next;
	}
}

pLinkNode Merge_List(pLinkNode plist1, pLinkNode plist2)
{
	assert(plist1);
	assert(plist2);
	pLinkNode plist3 = NULL;
	pLinkNode cur = NULL;
	if (NULL == plist1->_next)
		return plist2;
	if (NULL == plist2->_next)
		return plist1;
	if (plist1->_next->_data < plist2->_next->_data)
		plist3 = plist1;
	else
		plist3 = plist2;
     	plist1 = plist1->_next;
		plist2 = plist2->_next;
		cur = plist3;
	while (plist1 && plist2)    //两链表进行比较
	{
		if (plist1->_data <= plist2->_data)
		{
			cur->_next = plist1;
			plist1 = plist1->_next;
			cur = cur->_next;
		//	plist3 = plist3->_next;
		}
		else if (plist1->_data > plist2->_data)
		{
			cur->_next = plist2;
			plist2 = plist2->_next;
			cur = cur->_next;

			//plist3 = plist3->_next;
		}
		//某一链表已走完
		//if (NULL!=plist1&&NULL!=plist2)
		if (plist1 == NULL)
		{
			while (plist2)
			{
				cur->_next= plist2;
				plist2 = plist2->_next;
				cur = cur->_next;
			//	plist3 = plist3->_next;

			}
		}
		if (plist2 == NULL)
		{
			while (plist1)
			{
				 cur ->_next= plist1;
				plist1 = plist1->_next;
				cur = cur->_next;

			//	plist3 = plist3->_next;

			}
		}
	}
	return plist3;
}
void print_List(pLinkNode plist)
{
	
	pLinkNode cur = plist;
	while (cur)
	{
		printf("%d->", cur->_data);
		cur = cur->_next;
	}
	printf("NULL\n");

}


test.c

#include"Merge.h"

void test()
{
	LinkNode p1;
	LinkNode p2;
	pLinkNode p3 = NULL;
	//LinkNode p1, p2;
	Init_List(&p1);
	Init_List(&p2);
	Push_List(&p1, 1);
	Push_List(&p1, 3);
	Push_List(&p1, 5);
	Push_List(&p1, 7);
	print_List(&p1);
	Push_List(&p2, 2);
	Push_List(&p2, 4);
	Push_List(&p2, 6);
	Push_List(&p2, 8);
	print_List(&p2);
    p3=Merge_List(&p1,&p2);
	print_List(p3);
}
int main()
{
	test();
	getchar();
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值