您的位置:首页 > 其它

合并有序链表

2015-06-25 16:36 239 查看
1问题描述:根据两个有序单链表生成一个新的有序单链表,原有单链表保持不变。要求新生成的链表中不允许有重复元素。

2算法思路:

一,用指针p指向单链表A的第一个结点(这里的第一个结点不包括头结点),用指针q指向单链表B的第一个结点(这里的第一个结点不包括头结点),

二,在指针p,q皆不为空的条件下循环,在此循环下可能为出现以下三种红情况。1:p指向的结点和q指向的结点中的数据相等,构建一个新的结点,将p(q)指向的结点中的数据赋值给新的结点,然后将指针p,q向后移一位;2:p指向的结点中的数据大于q指向的结点中的数据,构建一个新的结点,将q指向的结点中的数据赋值给新的结点,然后将指针q向后移一位;3:p指向的结点中的数据小于q指向的结点中的数据,构建一个新的结点,将p指向的结点中的数据赋值给新的结点,然后将指针p向后移一位;

三,第二步之后,只可能出现一条链表中的数据没有完全并入到新的有序链表中,所以分别检测指针p,q,如果不为空,则将其并入到新的有序链表中;

3代码示例:

#include<iostream>
using namespace std;

struct Node
{
	int data;
	Node* next;
};

void CreateList(Node* &L);
void ShowList(Node* L);
void MergeList(Node* &AB, Node* A, Node* B);

int main()
{
	Node* AB = NULL;
	Node* A = NULL;
	Node* B = NULL;

	CreateList(A);
	CreateList(B);
	
	ShowList(A);
	ShowList(B);	

	MergeList(AB, A, B);
	ShowList(AB);
	
	return 0;
}

void CreateList(Node* &L)
{
	Node* pTemp = NULL;
	Node* pTrail = NULL;

	L = new Node;
	L->data = 0;
	
	pTrail = L;

	int n = 0;
	cout << "List the count of the number: " ;
	cin >> n;
	int* Data = new int
;
	cout << "Please input the " << n << " number: " << endl;
	for(int i=0; i<n; i++)
		cin >> Data[i];

	for(int j=0; j<n; j++)
	{
		pTemp = new Node;
		pTemp->data = Data[j];
		pTemp->next = NULL;
		
		pTrail->next = pTemp;
		pTrail = pTrail->next;
	}
	pTrail = NULL;
}

void ShowList(Node* L)
{
	Node* p = L->next;
	while( p != NULL )
	{
		cout << p->data << "  ";
		p = p->next;
	}
	cout << endl;
}

void MergeList(Node* &AB, Node* A, Node* B)
{
	AB = new Node;
	AB->data = 0;
	AB->next = NULL;
	
	Node* p = A->next;
	Node* q = B->next;
	Node* trail = AB;
	
	while( p != NULL && q != NULL)
	{
		Node* temp = new Node;
		temp->next = NULL;
		
		if(p->data == q->data)
		{
			temp->data = p->data;
			trail->next = temp;
			trail = trail->next;
			p = p->next;
			q = q->next;
		}
		else if( p->data < q->data)
		{
			temp->data = p->data;
			trail->next = temp;
			trail = trail->next;
			p = p->next;
		}
		else
		{
			temp->data = q->data;
			trail->next = temp;
			trail = trail->next;
			q = q->next;
		}
	}
	
	while( p != NULL)
	{
		Node* temp = new Node;
		temp->next = NULL;
		temp->data = p->data;
		trail->next = temp;
		trail = trail->next;
		p = p->next;
	}
	
	while( q != NULL)
	{
		Node* temp = new Node;
		temp->next = NULL;
		temp->data = q->data;
		trail->next = temp;
		trail = trail->next;
		q = q->next;
	}
	trail = NULL;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: