二刷LeetCode--148. 排序链表(C++版本),必会题,思维题

news/2024/10/23 7:32:57/

思路,本题其实考察了两个点:合并链表、链表切分。首先从1开始,将链表切成一段一段,因为需要使用归并,所以下一次的切分长度应该是当前切分长度的二倍,每次切分,我们拿出两段,然后将第三段的开头赋值给一个指针,合并前面两段,下一次继续从第三段开始切分,然后继续合并。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* sortList(ListNode* head) {// 定义虚拟头节点,注意这里不是结构体指针类型ListNode dummyhead(0);// 指针处理,这里使用点而不是箭头,虚拟头节点之后的节点是头节点dummyhead.next = head;int len = 0;ListNode *p = head;// 计算链表长度while(p){++len;p = p -> next;}// 开始切割链表,从短的开始逐渐合成长的// 注意size每次增加长度为之前的两倍(左移一位)for(int size = 1;size < len;size <<= 1){ListNode *cur = dummyhead.next;ListNode *tail = &dummyhead;while(cur){// 切下来一段链表节点ListNode *left = cur;// right是下一段链表的初始节点ListNode *right = cut_list(left, size);// 从下一段链表开始,继续切cur = cut_list(right, size);// 切分之后开始进行合并,比如首先合并left,right为首的这两段tail -> next = merge(left, right);// 当下一个位置不为空的时候继续进行游走,直到(合并好的链表的)末尾while(tail -> next){tail = tail -> next;}}}return dummyhead.next;}ListNode *cut_list(ListNode *head, int n){int size = n;ListNode *p = head;// 如果需要切的size是1,那么就不需要裁切,所以首先对size进行自减while(--size && p){p = p -> next;} // 如果走到头了,就返回空if(p == nullptr)return nullptr;// 如果不为空,就把p节点之后的节点进行处理ListNode *next = p -> next;p -> next = nullptr;// 返回被切分的下一个节点的位置return next;}ListNode *merge(ListNode *l1, ListNode *l2){// 虚拟头节点ListNode dummyhead(0);ListNode *p = &dummyhead;// 当二者都不为空的时候开始归并while(l1 && l2){// 选择较小的进行尾插if(l1 -> val <= l2 -> val){p -> next = l1;p = p -> next;// 尾插结束之后游标后移l1 = l1 -> next;}else{p -> next = l2;p = p -> next;// 尾插结束之后游标后移l2 = l2 -> next;}}if(l1)p -> next = l1;if(l2)p -> next = l2;// 因为是虚拟头节点,所以返回第一个数据节点return dummyhead.next;}
};

http://www.ppmy.cn/news/1037840.html

相关文章

Jetpack 中的 LiveData 粘性事件

什么叫粘性事件 LiveData使用篇Jetpack 中的 LiveData - 使用篇_简单不一定不好的博客-CSDN博客后再进一步了解LiveData。观察者和被观察者&#xff0c;正常情况下观察者先注册&#xff0c;被观察者再发送观察事件&#xff1b;所以粘性事件可以理解为观察者模式的升级&#xf…

LeetCode235. 二叉搜索树的最近公共祖先

235. 二叉搜索树的最近公共祖先 文章目录 [235. 二叉搜索树的最近公共祖先](https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/)一、题目二、题解方法一&#xff1a;递归方法二&#xff1a;迭代 一、题目 给定一个二叉搜索树, 找到该树中两个指定…

ZooKeeper的应用场景(集群管理、Master选举)

5 集群管理 随着分布式系统规模的日益扩大&#xff0c;集群中的机器规模也随之变大&#xff0c;因此&#xff0c;如何更好地进行集群管理也显得越来越重要了。 所谓集群管理&#xff0c;包括集群监控与集群控制两大块&#xff0c;前者侧重对集群运行时状态的收集&#xff0c;后…

uniapp 上传比较大的视频文件就超时

uni.uploadFile&#xff0c;上传超过10兆左右的文件就报错err&#xff1a;uploadFile:fail timeout&#xff0c;超时 解决&#xff1a; 在manifest.json文件中做超时配置 uni.uploadFile({url: this.action,method: "POST",header: {Authorization: uni.getStorage…

IDEA部署配置Maven项目教程,IDEA配置Tomcat(2019.3.3)(2023.1.3)

我们往往会用到多版本的IDEA进行一个Maven项目配置部署&#xff0c;还有tomcat的配置&#xff0c;这里就有你需要的&#xff0c;有低版本的&#xff0c;也有高版本的&#xff0c;根据自己的情况来进行一个操作 一、前言 当涉及到软件开发和项目管理时&#xff0c;使用一个可靠的…

数字图像处理-AWB跳变

1、自动白平衡&#xff08;AWB&#xff09;算法是相机中常用的图像处理技术&#xff0c;它能够自动调整图像中的白平衡&#xff0c;使得图像中的颜色更加真实、自然。然而&#xff0c;在实际应用中&#xff0c;AWB算法也存在着一些问题&#xff0c;例如AWB跳变&#xff08;Whit…

LVS-DR模式

目录 1、概述 2、LVS-DR模式的工作原理&#xff1a; 3、在LVS-DR模式下&#xff0c;数据包的流向分析如下&#xff1a; 4、LVS-DR是一种用于构建高可用性负载均衡集群的技术模式。LVS-DR模式具有以下特点&#xff1a; 5、LVS-DR中的ARP问题 6、配置LVS-DR需要以下几个关键…

Kubernetes网络组件详解

目录 1、Kubernetes网络组件 1.1、Flannel网络组件 1.2、Calico 网络插件 2、环境准备 2.1、主机初始化配置 2.2、部署docker环境 3、部署kubernetes集群 3.1、组件介绍 3.2、配置阿里云yum源 3.3、安装kubelet kubeadm kubectl 3.4、配置init-config.yaml 3.6、安装…