力扣(LeetCode)25. K 个一组翻转链表(C++)
创始人
2024-02-03 13:56:31
0

模拟

前置知识 : 反转链表、两两交换链表中的节点 。 LeetCode 有相应题目,可以先做。


设置哑结点 , 便于操作头结点。 翻转至少要 kkk 个结点 , 先检查剩余结点够不够 kkk 个。 不够 kkk 个就翻转完成了。

翻转分为组内翻转和首尾变向两步 。 如图所示 , 当 k=3k =3k=3 , 111 -> 222 -> 333 变成 333 -> 222 -> 111 就是组内翻转 。 OOO -> 333 , 111 -> 444 就是首尾变向 。
1

模拟组内翻转 。 对于第一组,组前结点 p=Op=Op=O 。 用 aaa 表示 ppp -> nextnextnext ,bbb 表示 aaa -> nextnextnext ,ccc 表示 bbb -> nextnextnext 。 让 bbb -> next=anext = anext=a 完成反向 , a=b,b=ca=b , b=ca=b,b=c 让 a、ba、ba、b 后移。组内 kkk 个点之间的连接线一共 k−1k-1k−1 条,循环 k−1k-1k−1 次 , 完成组内翻转 。
在这里插入图片描述
组内翻转的最后 , aaa 为组内第一个结点 , bbb 为下一组的第一个结点 , 组前结点 ppp 的指向没有变过 , ppp -> nextnextnext 依然指向翻转前的第一个点 ,所以首尾变向很容易完成 , 见代码。

代码展示

C++

class Solution {
public:ListNode* reverseKGroup(ListNode* head, int k) {auto dummy = new ListNode(-1);dummy->next = head;auto p= dummy;while(1){auto t = p;for(int i = 0;inext;//检查k个结点够不够。if(!t) break;//剩余结点不足k个auto a = p->next , b = a->next;for(int i = 0;iauto c = b->next;b->next = a;a = b , b = c;}auto c = p->next;p->next = a, c ->next = b;p = c;}return dummy->next;}
};
  1. 时间复杂度 : O(n)O(n)O(n) , nnn 是链表长度,翻转链表的时间复杂度 O(n)O(n)O(n) ,遍历链表的时间复杂度O(n)O(n)O(n) , 二者是相加关系 , 每个结点最多被遍历两遍 , 总时间复杂度 O(2n)O(2n)O(2n) , 忽略常数时间复杂度 O(n)O(n)O(n) 。
  2. 空间复杂度: O(1)O(1)O(1) , 除若干变量占用的常量级空间,没有使用额外的线性空间

AC

AC

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...