合并两个排序链表
2016-03-17 13:59
323 查看
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { if( pHead1 == NULL) return pHead2; if (pHead2 == NULL) return pHead1; ListNode* pHead=NULL; ListNode* pLast=NULL; ListNode* pStart1=pHead1; ListNode* pStart2=pHead2; ListNode* pEnd1 = pHead1; ListNode* pEnd2 = pHead2; if(pHead1->val < pHead2->val){ pHead = pHead1; pLast = pHead; pStart1=pStart1->next; pEnd1=pStart1; }else{ pHead = pHead2; pLast = pHead; pStart2 = pStart2->next; pEnd2 = pStart2; } while(pStart1 != NULL && pStart2 != NULL){ if(pStart1->val < pStart2->val){ while(pEnd1->next !=NULL && pEnd1->next->val < pStart2->val){ pEnd1 = pEnd1->next; } pLast->next = pStart1; pLast = pEnd1; pEnd1 = pEnd1->next; pStart1 = pEnd1; }else{ while(pEnd2->next!=NULL && pEnd2->next->val < pStart1->val){ pEnd2 = pEnd2->next; } pLast->next = pStart2; pLast = pEnd2; pEnd2 = pEnd2->next; pStart2 = pEnd2; } } if(pStart1 == NULL) { pLast ->next = pStart2; }else if(pStart2 == NULL){ pLast->next = pStart1; } return pHead; } };
一般的解法有两种
一个通过递归来解
再就是通过循环还解
以上的是通过循环还解的,不过在通用的解法基础上做了一些改进
通常是一个一个节点的比较,比较之后再取小的一个合并,如此重复,直至完成,最后把余下的一个链表全加进去。
上面的是,一段一段的合并,如果 表1 表头比表2小,就再往下找下去,直到一个比表2表头大的那个,然后把这一段加进去。
相关文章推荐
- Exchange 2013恢复已删除项目
- smtp协议解析分析(源代码)
- C++ 构造函数
- 获取当前星期
- 用GDB调试程序(一)
- webBrowser执行js的方法,并返回值,c#后台取值
- CSS RESET —— 浏览器样式重置
- oracle创建监听Oracle Net Services 配置失败。退出代码是1
- Android Studio快捷键设置成跟Eclipse一样
- HTML5 - 让老浏览器支持新语义元素的几种方法
- centos 6.7 python安装pymssql
- 安卓 命名规范
- LINK : fatal error LNK1201: 写入程序数据库
- Newtonsoft.Json高级用法
- 文件转Base64格式
- C++ 虚析构函数
- 转载--详解tomcat配置
- 第四周 扒开系统调用的三层皮(上)
- 如何用Jmeter做压力测试
- 阿里云ECS跨域问题