【链表面试题】合并两个有序链表, 合并后依然有序

版权声明:如需转载,请注明出处 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;
}

猜你喜欢

转载自blog.csdn.net/baidu_41813368/article/details/83591747