1. 程式人生 > >【連結串列面試題】合併兩個有序連結串列, 合併後依然有序

【連結串列面試題】合併兩個有序連結串列, 合併後依然有序

程式碼

// 合併兩個有序連結串列 
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;
}