1. 程式人生 > >將兩個按元素值遞增排序的單鏈表合併成一個按元素值遞減的單鏈表

將兩個按元素值遞增排序的單鏈表合併成一個按元素值遞減的單鏈表

題目:假設有兩個按元素值遞增次序排列的單鏈表,請編寫演算法將這兩個單鏈表合併成一個按元素值遞減次序排序的單鏈表,並要求利用原來兩個單鏈表的節點存放合併後的單鏈表。

思路:首先比較兩個單鏈表的最前面的元素,將較小者從原始單鏈表中拆除下來,連線到新的目標連結串列上,重複這一過程,直到有一個連結串列為空。然後將有剩餘元素的單鏈表中剩餘元素按逆序新增到目標單鏈表中。

#include<iostream>
using namespace std;
template <class T>
struct Node
{
	T element;
	Node* link;
	Node() { link = NULL; }
};
template <class T>
Node<T>* MergeList(Node<T>*& p, Node<T>*& q)
{
	Node<T>* dest = NULL;
	Node<T>* tmp  = NULL;

	while (p != NULL && q != NULL)//當兩個連結串列都不為空
	{
		//將兩個連結串列的開頭節點值較小的從原連結串列拆除,並新增到目標連結串列上
		if (p->element <= q->element)
		{
			tmp = p->link;
			p->link = dest;
			dest = p;
			p = tmp;
		}
		else
		{
			tmp = q->link;
			q->link = dest;
			dest = q;
			q = tmp;
		}
	}
	//當有一個連結串列還有剩餘元素時,將剩餘元素逆序新增到目標單鏈表上
	while (p != NULL)
	{
		tmp = p->link;
		p->link = dest;
		dest = p;
		p = tmp;
	}
	while (q != NULL)
	{
		tmp = q->link;
		q->link = dest;
		dest = q;
		q = tmp;
	}
	//返回合併後的目標連結串列
	return dest;
}
int main()
{
	//元素按遞增排序的單鏈表1
	Node<int>* odd_n9 = new Node<int>; odd_n9->element = 9; odd_n9->link = NULL;
	Node<int>* odd_n7 = new Node<int>; odd_n7->element = 7; odd_n7->link = odd_n9;
	Node<int>* odd_n5 = new Node<int>; odd_n5->element = 5; odd_n5->link = odd_n7;
	Node<int>* odd_n3 = new Node<int>; odd_n3->element = 3; odd_n3->link = odd_n5;
	Node<int>* odd_n1 = new Node<int>; odd_n1->element = 1; odd_n1->link = odd_n3;

	//元素按遞增排序的單鏈表2
	Node<int>* even_n10 = new Node<int>; even_n10->element = 10; even_n10->link = NULL;
	Node<int>* even_n8 = new Node<int>; even_n8->element = 8; even_n8->link = even_n10;
	Node<int>* even_n6 = new Node<int>; even_n6->element = 6; even_n6->link = even_n8;
	Node<int>* even_n4 = new Node<int>; even_n4->element = 4; even_n4->link = even_n6;
	Node<int>* even_n2 = new Node<int>; even_n2->element = 2; even_n2->link = even_n4;

	//合併上面兩個單鏈表
	Node<int>* MergeResult = MergeList(odd_n1, even_n2);

	//輸出合併後的單鏈表元素
	while (MergeResult!= NULL)
	{
		cout << MergeResult->element << " ";
		MergeResult = MergeResult->link;
	}
	cout << endl;

	//釋放原來所有的節點
	while (odd_n1 != NULL)
	{
		Node<int>* temp = odd_n1;
		odd_n1 = odd_n1->link;
		delete temp;
	}
	while (even_n2 != NULL)
	{
		Node<int>* temp = even_n2;
		even_n2 = even_n2->link;
		delete temp;
	}
	return 0;
}



main函式中構造了兩個按元素遞增排序的單鏈表1->3->5->7->9和2->4->6->8->10,按題目要求,輸出結果應該為10 9 8 7 6 5 4 3 2 1,執行結果如下圖所示:

                                       
上圖結果說明演算法設計正確。