您的位置:首页 > 其它

将两个按元素值递增排序的单链表合并成一个按元素值递减的单链表

2016-10-05 18:18 295 查看
题目:假设有两个按元素值递增次序排列的单链表,请编写算法将这两个单链表合并成一个按元素值递减次序排序的单链表,并要求利用原来两个单链表的节点存放合并后的单链表。

思路:首先比较两个单链表的最前面的元素,将较小者从原始单链表中拆除下来,连接到新的目标链表上,重复这一过程,直到有一个链表为空。然后将有剩余元素的单链表中剩余元素按逆序添加到目标单链表中。

#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,运行结果如下图所示:



上图结果说明算法设计正确。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  合并两个单链表
相关文章推荐