手撕合并两个有序链表【递增】

本文介绍了如何在C++中使用结构体和函数实现链表的定义、尾插法插入节点、合并两个有序链表以及释放动态内存的过程,通过testMergeListNode函数展示了链表操作的实际应用。
摘要由CSDN通过智能技术生成
#include<iostream>
#include<vector>
using namespace std;


//链表定义
struct LIST_NODE
{
	int m_data;
	LIST_NODE* m_next;
	LIST_NODE(const int &data=0):m_data(data),m_next(nullptr)
	{

	}
	~LIST_NODE()
	{

	}
};
//采用尾插法
void insertListNode(LIST_NODE* node, LIST_NODE* inNode)
{
	//创造一个有序
	while (node->m_next)
	{
		node = node->m_next;
	}
	node->m_next = inNode;
}
//合并两个有序链表
LIST_NODE* mergeListNode(LIST_NODE* node1, LIST_NODE* node2)
{
	//这里合并两个有序链表
	LIST_NODE* newNode = nullptr;
	while (node1&&node2)
	{
		LIST_NODE* tempNode = nullptr;
		if (node1->m_data<=node2->m_data)
		{
			tempNode = node1;
			node1 = node1->m_next;
			
		}
		else
		{
			tempNode = node2;
			node2 = node2->m_next;
		}
		tempNode->m_next = nullptr;
		if (newNode)
		{
			insertListNode(newNode, tempNode);
		}
		else
		{
			newNode = tempNode;
		}
	}
	if (node1)
	{
		insertListNode(newNode, node1);
	}
	if (node2)
	{
		insertListNode(newNode, node2);
	}
	return newNode;
}


//创建链表
void createListNode(LIST_NODE* &head)
{
	int num = 0;
	cin >> num;
	for (int i=0;i<num;i++)
	{
		int data = rand();
		if (head)
		{
			auto tempNode=new LIST_NODE(data);
			head=mergeListNode(head, tempNode);
		}
		else
		{
			head = new LIST_NODE(data);
			
		}
	}
}
//释放动态分配的内存
void freeNode(LIST_NODE* node)
{
	while (node)
	{
		auto tempNode = node;
		node = node->m_next;
		delete tempNode;
		tempNode = nullptr;
	}
	node = nullptr;
}
//输出链表数据
void outPutData(LIST_NODE* node)
{
	while (node)
	{
		cout << node->m_data <<" ";
		node = node->m_next;
	}
	cout << endl;
}
//测试函数
void testMergeListNode()
{
	LIST_NODE* head1 = nullptr;
	LIST_NODE* head2 = nullptr;
	createListNode(head1);
	createListNode(head2);
	cout << "未合并之前head1的数据" << endl;
	outPutData(head1);
	cout << "未合并之前head2的数据" << endl;
	outPutData(head2);
	auto comListNode = mergeListNode(head1, head2);
	cout << "合并以后的数据" << endl;
	outPutData(comListNode);
	//释放动态内存
	freeNode(comListNode);
	comListNode = nullptr;
}
int main()
{
	testMergeListNode();
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值