单链表合并排序
来源:互联网 发布:数据挖掘 答案 韩家炜 编辑:程序博客网 时间:2024/06/16 10:06
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则
题目来源:牛客网
https://www.nowcoder.com/questionTerminal/d8b6b4358f774294a89de2a6ac4d9337
非递归思路
如果其中有一个链表为空,则返回另一个链表(包括两个都为空时,直接返回空)
创建两个指针,p 和 tail(其中tail用来表示p的尾)
访问两个链表的第一个首元素,将值最小的那个赋值给p和tail,然后较小的那个链表指针下移一位。
当两个链表同时不为空时,遍历两个两个链表,并作以下操作:
把两个链表中元素较小的那个节点链接到tail的后面,
将该节点后移一位
并将tail后移一位
当有剩余链表时,遍历剩余部分,并将其加入到tail的后面
整个合并排序结束,并且没有多余节点和链表生成。
/*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) return pHead2; if(!pHead2) return pHead1; //借助两个新的指针,tail为p的尾 ListNode* p = NULL; ListNode* tail = NULL; //将两个链表中最小的首元素赋值给p和tail if(pHead1->val >= pHead2->val) { p = tail = pHead2; pHead2 = pHead2->next; }else{ p = tail = pHead1; pHead1 = pHead1->next; } //对两个链表进行遍历 while(pHead1 && pHead2) { //将当前两个链表中的最小值链接到tail的尾 if(pHead1->val >= pHead2->val) { tail->next = pHead2; //将已经链接到tail后的节点指针下移一位 pHead2 = pHead2->next; }else{ tail->next = pHead1; pHead1 = pHead1->next; } //tail还是指向链表最尾端 tail = tail->next; } //对剩余的节点做处理(剩下的全部都插入尾端) ListNode* t = pHead1?pHead1:pHead2; while(t) { tail->next = t; tail = tail->next; t = t->next; } return p; }};
阅读全文
0 0
- 单链表创建、排序、合并
- 单链表合并排序
- 单链表的排序与合并
- 合并两个已排序单链表
- 合并两个排序的单链表
- 单链表的排序合并实现
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- HDU 1071 The area(抛物线与直线围成的面积)
- App的网络测试中性能优化方案
- git 切换分支
- MyBatis数据源DataSource分类
- 如何正确地写出单例模式
- 单链表合并排序
- 《利用python进行数据分析》学习笔记(六)
- javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint-实体报错
- 设计模式之组合模式
- QML中sql语句的实现
- 动态加载JS脚本
- 51 Nod 1130 N的阶乘的长度 V2(斯特林近似)
- rabbimq 集群部署说明
- 剑指Offer笔记—— 从尾到头打印链表 重建二叉树