合并有序链表
2015-06-25 16:36
309 查看
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代码示例:
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; }
相关文章推荐
- SpringMVC自定义日期类型的数据绑定
- spring mvc提交日期类型参数
- [Err] 1172 - Result consisted of more than one row
- 读书时间《JavaScript高级程序设计》二:面向对象
- php array_walk_recursive函数的使用
- (转)Android开发--常用的传感器总结
- 在相同的主机上创建一个duplicate数据库
- 程序是怎样跑起来的 简述
- linux源码安装服务添加为系统服务
- VMWare Datastore Performance Monitor
- 成功format tachyon,底层是hdfs
- getline()详解
- Linux上基于网络自动化安装系统(CentOS6.5+DHCP+TFTP+PXE)
- Cygwin运行nutch报错:Failed to set permissions of path
- SpringMVC日期类型转换问题三大处理方法归纳
- 淘宝账号基于OAuth2.0的登录验证授权登陆第三方网站
- Redis List命令
- leetcode[143]:Reorder List
- 索引、视图、游标、存储过程和触发器的理解
- 使用 varnish + nginx + lua 搭建网站的降级系统