刷题-力扣-25
25. K 个一组翻转链表
题目链接
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group/
作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目描述
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例:
给你这个链表:1-2-3-4-5
当 k = 2 时,应当返回: 2-1-4-3-5
当 k = 3 时,应当返回: 3-2-1-4-5
说明:
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
题目分析
根据题目描述,颠倒链表中k个结点
使用栈的后进先出的思想,让链表依次入栈k个到vecNode中
从vecNode中依次从后向前出栈到res的末尾
依次循环直到剩余的结点不够k个
把剩余不够k个的结点添加到res的末尾,res即为所求
代码
/**
* 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* reverseKGroup(ListNode* head, int k) {
vectorListNode* vecNode;
ListNode* res = nullptr;
ListNode* p;
while (head) {
int i = 0;
for (i; i k; i++) {
if (head) {
vecNode.push_back(head);
head = head-next;
} else break;
}
if (vecNode.size() != k) break;
for (i; i 0; i--) {
if (res == nullptr) {
res = vecNode[i - 1];
p = res;
}
else {
p-next = vecNode[i - 1];
p = p-next;
p-next = nullptr;
}
}
vecNode.clear();
}
for (int i = 0; i vecNode.size(); i++) {
p-next = vecNode[i];
p = p-next;
p-next = nullptr;
}
return res;
}
};
刷题-力扣-25 相关文章
力扣605. 种花问题
原题 这题代码写得很烂 思路: 将flowerbed数组分段,记录区间端点是0是1,保证每个区间端点以外都是连续的0序列,最后对区间端点进行分类讨论 如flowerbed数组为[0,1,0,0,0,0,1] 则分段为: 【0,1】【1,0,0,0,0,1】 对应区间去除端点外所含0序列长度n
2021.2.10 刷题(判断一棵树是否是二叉搜索树)
题目链接:https://leetcode-cn.com/problems/validate-binary-search-tree 题目描述: 给定一个二叉树,判断其是否是一个有效的二叉搜索树。 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。
2021.2.10 刷题(构造最大二叉树)
题目链接:https://leetcode-cn.com/problems/maximum-binary-tree 题目描述: 给定一个不含重复元素的整数数组 nums 。一个以此数组直接递归构建的 最大二叉树 定义如下: 二叉树的根是数组 nums 中的最大元素。 左子树是通过数组中 最大值左边部分 递归构
【题解】力扣992. K 个不同整数的子数组
题目来源 992. K 个不同整数的子数组 题目描述:给定一个正整数数组 A ,如果 A 的某个子数组中不同整数的个数恰好为 K ,则称 A 的这个连续、不一定独立的子数组为 好子数组 。 思路 恰好包含K种不同整数的子区间 = 最多包含K种整数的子区间 - 最多包含K-1
力扣567.字符串的排列—C语言实现
题目 来源:力扣(LeetCode)
【PAT刷题】快速产出垃圾——2020-2-9
接昨晚B1024/A1073 (2)参考答案 1 #include cstdio 2 #include cstring 3 4 int main(){ 5 char str[10010]; 6 scanf("%s",str); 7 int len = strlen(str); 8 if(str[0]=='-') printf("-"); //如果是负数,输出负号 9 10 int pos =0;11 while(str[pos]!='E
算法刷题指南来自GitHub 68.8k star的硬核算法教程
很多朋友害怕算法,其实大可不必,算法题无非就那几个套路,一旦掌握,就会觉得算法实在是太朴实无华且枯燥了! 本文选自硬核算法教程 《labuladong的算法小抄》 ,带你学习套路,把握各类算法问题的共性! 数据结构是工具,算法是通过合适的工具解决特定问
luogu集合刷题进阶
昨天光顾着跟kerin聊天忘记存盘了,写到一半的blog就,,,没了 今天主要是绿题 怕怕 , 主要是两个集合之间的东西,,,比如并查集 P1982 反集: 如果a和b是敌人,合并n+b和a,n+a和b 如果c和a是敌人,合并n+c和a,n+a和c 那么b和c就并在一起了 这样就符合了
【题解】力扣978. 最长湍流子数组
题目来源 978. 最长湍流子数组 方法一 滑动窗口,双指针 第一种情况和第二种情况分开讨论 当符合条件的时候, left 不动, right 加1; 不符合条件的时候, left 等于 right ; 窗口长度为 right-left+1 ; 长度为1的时候特判,返回1; 代码 class Solution
LeetCode刷题笔记 - 12. 整数转罗马数字
学好算法很重要,然后要学好算法,大量的练习是必不可少的,LeetCode是我经常去的一个刷题网站,上面的题目非常详细,各个标签的题目都有,可以整体练习,本公众号后续会带大家做一做上面的算法题。 官方链接:https://leetcode-cn.com/problemset/all/ 一、