合并两个有序链表--实现1+2+3+....+n,时间复杂度为O(1)
来源:互联网 发布:柬埔寨网络博客 编辑:程序博客网 时间:2024/05/23 10:25
1、合并两个有序链表,合并以后的链表依旧有效
C语言实现
链表结点定义如下:
typedef int DataType;typedef struct Node{ DataType _data; struct Node* _pNext;}Node,*PNode;
实现代码:
void InitList(PNode* pHead) //初始化单链表{ assert(pHead); //printf("%x\n",&pHead); *pHead=NULL;}Node* BuyNode(DataType data) //创建新结点{ Node *pNewNode=(Node*)malloc(sizeof(Node)); if(NULL!=pNewNode) { pNewNode->_data=data; pNewNode->_pNext=NULL; } return pNewNode;}void PushBack(PNode* pHead,DataType data) //插入新结点{ assert(pHead); if(NULL==*pHead) { *pHead=BuyNode(data); } else { Node* pTailNode=*pHead; while(pTailNode->_pNext) { pTailNode=pTailNode->_pNext ; } pTailNode->_pNext=BuyNode(data); }}void PrintList(PNode pHead) //打印单链表{ Node* pCurNode=pHead; while(pCurNode) { printf("%d->",pCurNode->_data); pCurNode=pCurNode->_pNext; } printf("NULL\n");}PNode MergeList(PNode pHead1, PNode pHead2) //合并两个单链表{ PNode pL1=pHead1; PNode pL2=pHead2; PNode pNewHead=NULL; PNode pTailNode=NULL; if(pHead1==NULL) return pHead2; if(pHead2==NULL) return pHead1; pL1=pHead1; pL2=pHead2; if(pL1->_data <=pL2->_data) { pNewHead=pL1; pTailNode=pL1; pL1=pL1->_pNext; } else { pNewHead=pL2; pTailNode=pL2; pL2=pL2->_pNext; } while(pL1&&pL2) { if(pL1->_data<=pL2->_data) { pTailNode->_pNext=pL1; pL1=pL1->_pNext; } else { pTailNode->_pNext=pL2; pL2=pL2->_pNext; } pTailNode=pTailNode->_pNext; } if(NULL!=pL1) { pTailNode->_pNext =pL1; } if(NULL!=pL2) { pTailNode->_pNext=pL2; } return pNewHead;}void FunTest(){ Node *pHead1,*pHead2; InitList(&pHead1); PushBack(&pHead1,1); PushBack(&pHead1,3); PushBack(&pHead1,4); PushBack(&pHead1,5); PushBack(&pHead1,6); PrintList(pHead1); InitList(&pHead2); PushBack(&pHead2,2); PushBack(&pHead2,4); PushBack(&pHead2,6); PushBack(&pHead2,7); PushBack(&pHead2,8); PrintList(pHead2); pHead1=MergeList(pHead1,pHead2); PrintList(pHead1);}
链表合并以后的结果:
2、实现1+2+3+….+n,时间复杂度为O(1),要求不能使用乘除法,循环,条件判断,选择相关的关键字
//1.利用构造函数求解--一次创建N个对象,将累加的算法放到构造函数中class Sort{public: Sort() { N++; Sum += N; } static void Reset() { N = 0; Sum = 0; } static int Get() { return Sum; }private: static int N; static int Sum;}; int Sort::N = 0; int Sort::Sum = 0; int Sum_Solution1(int n){ Sort::Reset(); Sort* a = new Sort[n]; delete a; a = NULL; return Sort::Get();}
阅读全文
0 0
- 合并两个有序链表--实现1+2+3+....+n,时间复杂度为O(1)
- 两个有序数组合并,并求中位数(复杂度为O(m+n))
- 算法(时间复杂度为O(nlgk)的k有序链(从小到大)表合并为一个有序链表
- 使用O(n)的时间复杂度合并两个数组
- 时间复杂度为O(n),空间复杂度为O(1)
- 17_7_13:合并两个有序链表。实现1+2+3+...+n,不使用常规方法
- 分段有序数组合并成有序(空间复杂度为O(1))
- 最长有序子序列 时间复杂度O(n^2)
- 有1,2,…,n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度O(1),一次只能交换两个数
- 华为笔试:写排序算法,时间复杂度为O(n),空间复杂度O(1),一次只能交换两个数
- 从顺序表中删除所有值为x的元素(Java实现),要求时间复杂度O(n),空间复杂度O(1)
- K个有序链表共N个结点在O(NlgK)时间合并为一个新的有序链表实现文件C语言
- 合并两个排序数组(时间复杂度O(n))
- (C#)实现时间复杂度为O(n)空间复杂度为O(1)的数组中奇偶数分离
- 1~n无序数组时间复杂度为O(n)排序
- 1~n无序数组时间复杂度为O(n)排序
- 实现左移指定位数,时间复杂度O(n) ,空间复杂度O(1)
- 求两个有序序列的中位数。(要求时间复杂度为O(logN))
- Berland Bingo 【模拟】
- mac版安装mysql
- Markdown语法
- Caffe学习:Layers
- 分布式系统的理解
- 合并两个有序链表--实现1+2+3+....+n,时间复杂度为O(1)
- maven核心,pom.xml详解
- opencv训练自己的分类器
- firefox插件(plugin)开发概述
- 【自用】javanote20170713(运算符,复合运算符,逻辑运算符,位运算符,三目运算符)
- 我们写了一个名为smartzip的脚本,该脚本可以自动解压bzip2, gzip和zip 类型的压缩文件
- 王明利博士:CGF技术在丰胸上的特色
- hibernate映射关系级别注解
- 八、javaweb多表插入的事务控制