将两个按元素值递增排序的单链表合并成一个按元素值递减的单链表
2016-10-05 18:18
295 查看
题目:假设有两个按元素值递增次序排列的单链表,请编写算法将这两个单链表合并成一个按元素值递减次序排序的单链表,并要求利用原来两个单链表的节点存放合并后的单链表。
思路:首先比较两个单链表的最前面的元素,将较小者从原始单链表中拆除下来,连接到新的目标链表上,重复这一过程,直到有一个链表为空。然后将有剩余元素的单链表中剩余元素按逆序添加到目标单链表中。
main函数中构造了两个按元素递增排序的单链表1->3->5->7->9和2->4->6->8->10,按题目要求,输出结果应该为10 9 8 7 6 5 4 3 2 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,运行结果如下图所示:
上图结果说明算法设计正确。
相关文章推荐
- 已知两个链表 la和 lb,其元素值递增排序。编程将la和lb合并成一个递减有序(相同值元素只保留一个)的链表lc。(北方名校经典试题) 本题选做
- 将两个递增的链表合并成一个递减的链表(相同的元素只留下一个),并要求利用原表结点
- 将两个非递减的有序链表合并为一个非递增的有序链表(C语言编程实现)
- 将两个非递减的有序链表合并为一个非递增的有序链表
- 假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并为一个按元素值递减 有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原装(即A表和
- 将两个非递减的有序链表合并为一个非递增的有序链表(C语言编程实现)
- 将两个非递减的有序链表合并为一个非递增的有序链表
- 假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并为一个按元素值递减 有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原装(即A表和
- 假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并为一个按元素值递减 有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原装(即A表和
- 要完整准确的 均以单链表作存储结构 试编写算法将A表和B表归并成一个按元素值递减有序的线性表C 【数据结构】假设有两个按元素值递增有序的线性表A和B 并要求利用原表的空间存放C。谁会么
- 将两个递增有序的单链表合并成一个递减有序的单链表,利用原结点空间
- 将两个递增有序的单链表合并成一个递减有序的单链表,利用原结点空间
- 写程序。设ha和hb分别是两个带头结点的非递减有序单链表的头指针,试设计算法,将这两个有序链表合并成一个非递增有序的单链表。要求使用原链表空间,
- 两个递增有序链表合并为一个链表
- 单链表应用举例(单链表A和单链表B的元素都是非递减排列,利用单链表的基本运算,将它们合并成一个单链表C,要求C也是非递减序列)
- 合并两个单链表(单链表元素均按值非递减排列)
- 将两个递增的有序链表合并为一个递增的有序链表(C语言编程实现)
- 合并两个递增排序的链表
- 合并两个递增排序的链表
- 将一个递增和递减的有序链表,用原空间合并成递增有序的链表-O(n)复杂度