#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();
}
手撕合并两个有序链表【递增】
最新推荐文章于 2024-10-01 21:25:34 发布
本文介绍了如何在C++中使用结构体和函数实现链表的定义、尾插法插入节点、合并两个有序链表以及释放动态内存的过程,通过testMergeListNode函数展示了链表操作的实际应用。
摘要由CSDN通过智能技术生成