当前位置: 首页 > article >正文

C++速通LeetCode中等第21题-排序链表(空间O(1))

class Solution{
public:
	ListNode* sortList(ListNode* head){
		ListNode *h, *h1, *h2, *pre, *res; 
		//利用h找到该次归并的下一组起点,h1为当前归并组的左起点,h2为右起点
		//pre作为每次归并的虚设头结点,res为最终结果的虚设头结点 
		
		int len = 0;
		h = head;
		while(h){ //计算链表长度 
			len++;
			h = h->next;
		}
		
		int curr_len = 1; //当前归并目标的长度,当=length时归并结束 
		
		res = new ListNode(0);
		res->next = head;
		
		while(curr_len < len){
			pre = res;
			h = pre->next;
			while(h){ //当前长度的归并过程,h为空说明所有结点都遍历完成 
				int i = curr_len; //寻找左起点和右起点 
				h1 = h; //左起点 
				
				while(i>0 && h){
					i--;
					h = h->next;
				}
				if(i>0){ //若由于h为空退出循环,即未找到右起点就已经无剩余结点,那么归并完成 
					break;
				}
				h2 = h; //右起点 
				
				i = curr_len;
				int num2 = 0;
				while(i>0 && h){ //将h移动到该次归并下一组的起点 
					i--;
					h = h->next;
					num2++;
				}
				
				int num1 = curr_len;
				while(num1 > 0 && num2 > 0){ //归并 
					if(h1->val <= h2->val){
						pre->next = h1;
						h1 = h1->next;
						num1--;	
					}
					else{
						pre->next = h2;
						h2 = h2->next;
						num2--;
					}
					
					pre = pre->next; 
				}
				
				if(num1>0){
					pre->next = h1;
				}
				else if(num2>0){
					pre->next = h2;
				}
				
				while(num1>0 || num2>0){//移动到该组末尾 
					pre = pre->next;
					num1--;
					num2--;
				}
				
				pre->next = h; //连接下一组的起点 
			}
			
			curr_len *= 2;
		}
		
		
		return res->next;
	}
			
};


http://www.kler.cn/a/314619.html

相关文章:

  • 准确率调整研究中心
  • 【大数据学习 | HBASE高级】rowkey的设计,hbase的预分区和压缩
  • linux c/c++最高效的计时方法
  • 2024年11月13日
  • 《情商》提升:增强自我意识,学会与情绪共处
  • WordPress 2024主题实例镜像
  • 828华为云征文 | 华为云X实例的镜像管理详解
  • Unexpected end of file from server 错误
  • 系统架构设计师教程 第5章 5.4 软件测试 笔记
  • 论文阅读笔记:Sapiens: Foundation for Human Vision Models
  • MoCo和SimCLR【CV双雄】
  • mxnet算子调用kernel示例(MINIST)
  • Java面试篇-AOP专题(什么是AOP、AOP的几个核心概念、AOP的常用场景、使用AOP记录操作日志、Spring中的事务是如何实现的)
  • SYN Flood攻击原理,SYN Cookie算法
  • 【数据结构C语言】【入门】【首次万字详细解析】入门阶段数据结构可能用到的C语言知识,一章让你看懂数据结构!!!!!!!
  • 我的AI工具箱Tauri版-FasterWhisper音频转文本
  • 什么是 HTTP/3?下一代 Web 协议
  • 直播音频解决方案
  • PyTorch 实现手写数字识别
  • 2024华为杯数模CDEF成品文章!【配套完整解题代码+数据处理】
  • 一文读懂 JS 中的 Map 结构
  • 图形化编程012(变量-倒计时)
  • 【JVM原理】运行时数据区(内存结构)
  • 前端框架的比较与选择详解
  • 数据库提权【笔记总结】
  • 计算机毕业设计 社区医疗服务系统的设计与实现 Java实战项目 附源码+文档+视频讲解