版权声明:如需转载,请注明出处 https://blog.csdn.net/baidu_41813368/article/details/83591747
代码
// 合并两个有序链表
SListNode * MergeOrderedList(SListNode *p1First, SListNode *p2First)
{
SListNode*cur1 = p1First;
SListNode*cur2 = p2First;
SListNode*result = NULL;//结果链表
SListNode*tail = NULL;//结果链表中的最后一个结点,方便尾插
SListNode*next;//保存遍历过程中的下一个结点
while (cur1 != NULL && cur2 != NULL)
{
if (cur1->data <= cur2->data)
{
//应该取链表1的结点
if (result != NULL)
{
//结果链表不为空,直接在最后一个结点上做插入
//保存链表1的下一个结点,让循环继续
next = cur1->Next;
//插入过程
tail->Next = cur1;
cur1->Next = NULL;
//保存新的最后一个结点
tail = cur1;
cur1 = next;
}
else {
//保存链表1的下一个结点,让循环继续
next = cur1->Next;
result = cur1;
cur1->Next = NULL;
//保存新的最后一个结点
tail = cur1;
cur1 = next;
}
}
else
{
//应该取链表2的结点
if (result != NULL)
{
//结果链表不为空,直接在最后一个结点上做插入
//保存链表2的下一个结点,让循环继续
next = cur2->Next;
//插入过程
tail->Next = cur2;
cur2->Next = NULL;
//保存新的最后一个结点
tail = cur2;
cur2 = next;
}
else {
//保存链表1的下一个结点,让循环继续
next = cur2->Next;
result = cur2;
cur2->Next = NULL;
//保存新的最后一个结点
tail = cur2;
cur2 = next;
}
}
}
//一个链表为空了
if (cur1 == NULL)
{
tail->Next = cur2;
}
if (cur2 == NULL)
{
tail->Next = cur1;
}
return result;
}
测试用例
void TestMerge()
{
SListNode*List1 = NULL, *List2 = NULL;
SListPushBack(&List1, 1);
SListPushBack(&List1, 1);
SListPushBack(&List1, 3);
SListPushBack(&List1, 4);
SListPushBack(&List1, 6);
SListPushBack(&List2, 1);
SListPushBack(&List2, 2);
SListPushBack(&List2, 3);
SListNode*result = MergeOrderedList(List1, List2);
SListPrint(result);
}
结果
版本优化
// 合并两个有序链表
SListNode * MergeOrderedList(SListNode *p1First, SListNode *p2First)
{
SListNode*cur1 = p1First;
SListNode*cur2 = p2First;
SListNode*result = NULL;//结果链表
SListNode*tail = NULL;//结果链表中的最后一个结点,方便尾插
SListNode*next;//保存遍历过程中的下一个结点
SListNode*node;
while (cur1 != NULL && cur2 != NULL)
{
if(cur1->data<=cur2->data)
{
node = cur1;
}
else
{
node = cur2;
}
//应该取链表1的结点
//保存链表1的下一个结点,让循环继续
next = node->Next;
if (result != NULL)
{
//结果链表不为空,直接在最后一个结点上做插入
//插入过程
tail->Next = node;
}
else {
//保存链表1的下一个结点,让循环继续
result = node;
}
node->Next = NULL;
//保存新的最后一个结点
tail = node;
if (node == cur1)
{
cur1 = next;
}
else
{
cur2 = next;
}
node = next;
}
//一个链表为空了
if (cur1 == NULL)
{
tail->Next = cur2;
}
if (cur2 == NULL)
{
tail->Next = cur1;
}
return result;
}