首页 > 其他分享 >[leetcode 25]. K 个一组翻转链表

[leetcode 25]. K 个一组翻转链表

时间:2024-10-04 12:22:06浏览次数:1  
标签:25 p0 ListNode cur head next 链表 leetcode

题目描述:

https://leetcode.cn/problems/reverse-nodes-in-k-group

给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。

k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

 

示例 1:

输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]

示例 2:

输入:head = [1,2,3,4,5], k = 3
输出:[3,2,1,4,5]

 

提示:

  • 链表中的节点数目为 n
  • 1 <= k <= n <= 5000
  • 0 <= Node.val <= 1000

 

进阶:你可以设计一个只用 O(1) 额外内存空间的算法解决此问题吗?

解题思路:

 

 

视频讲解:

 

【视频第三段】https://www.bilibili.com/video/BV1sd4y1x7KN 

 

和92题反转过程类似,⚠️要创建临时变量nxt保存p0.next,最后更新p0=nxt,开启下一轮循环

代码(C++&Python):

 

class Solution:
    def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:

        # 统计链表个数
        n=0
        cur=head
        while cur:
            n+=1
            cur=cur.next
        
        dummy=ListNode(next=head)
        p0=dummy

        # 每次反转前看剩余节点个数是否>=k,>=k则反转,否则不反转
        while n>=k:
            n-=k
            cur=p0.next
            pre=None
            for _ in range(k):
                nxt=cur.next
                cur.next=pre
                pre=cur
                cur=nxt
            
            # 保存下一轮循环的上一个节点为p0
            next=p0.next
            p0.next.next=cur
            p0.next=pre
            p0=next
        
        return dummy.next
View Code

 

/**
 * 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) {
        int n=0;
        ListNode* cur=head;
        while(cur){
            n++;
            cur=cur->next;
        }

        ListNode dummy(0,head);
        ListNode* p0=&dummy;
        ListNode* nxt=nullptr;
        ListNode* pre=nullptr;
        cur=p0->next;

        while(n>=k){
            n-=k;
            for(int i=0;i<k;i++){
                nxt=cur->next;
                cur->next=pre;
                pre=cur;
                cur=nxt;
            }

            ListNode* next=p0->next;
            p0->next->next=cur;
            p0->next=pre;
            p0=next;
        }

        return dummy.next;    
    }
};
View Code

 

思路总结:

做题顺序:

206. 反转链表

24. 两两交换链表中的节点

92. 反转链表 II 25. K 个一组翻转链表   由易到难,逐步拓展思路   视频讲解: 【反转链表】https://www.bilibili.com/video/BV1sd4y1x7KN 

标签:25,p0,ListNode,cur,head,next,链表,leetcode
From: https://www.cnblogs.com/Makerr/p/18446498

相关文章

  • Leetcode 1498. 满足条件的子序列数目
    1.题目基本信息1.1.题目描述给你一个整数数组nums和一个整数target。请你统计并返回nums中能满足其最小元素与最大元素的和小于或等于target的非空子序列的数目。由于答案可能很大,请将结果对109+7取余后返回。1.2.题目地址https://leetcode.cn/problems/num......
  • [leetcode 92] 反转链表 II
    题目描述:https://leetcode.cn/problems/reverse-linked-list-ii给你单链表的头指针 head 和两个整数 left 和 right ,其中 left<=right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。 示例1:输入:head=[1,2,3,4,5],left=2,right......
  • <动态规划>Leetcode96.不同的二叉搜索树
    给你一个整数n,求恰由n个节点组成且节点值从1到n互不相同的二叉搜索树有多少种?返回满足题意的二叉搜索树的种数。解题步骤如下:二叉搜素树的相关概念寻找规律思路建立代码实现1.二叉搜索树的相关概念①:若左子树不空,则左子树所有节点的值均小于它的根节点的值。......
  • 25赛季算法组第一阶段第二次培训(ubuntu安装与基本使用)
    25赛季算法组第一阶段第二次培训1.Ubuntu的介绍1.1.操作系统和操作系统的选择操作系统,英文名称OperatingSystem,简称OS,是计算机系统中必不可少的基础系统软件,它是应用程序运行以及用户操作必备的基础环境支撑,是计算机系统的核心。操作系统的作用是管理和控制计算机系统中的......
  • 2023-11-25 Matlab和Python在气象中的常用代码 180401
    目录画图横坐标添加月份PythonMatlab画图横坐标添加月份Pythonimportmatplotlib.pyplotaspltimportpandasaspdimportnumpyasnp#准备时间和温度数据start_date=pd.to_datetime('1996-12-01')#thenextdateend_date=pd.to_datetime('1998-12-01')#the......
  • dremio25.1.1 发布
    就在昨天dremio发布了25.1.1主要是一些bug的fix,尤其是在25.1版本对于script保存的问题说明完整的变动信息可以参考官方文档,目前oss代码以及下载包,docker镜像已经都上传了,可以体验下参考资料https://docs.dremio.com/current/release-notes/version-250-releasehttps:/......
  • Leetcode 540. 有序数组中的单一元素
    1.题目基本信息1.1.题目描述给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。请你找出并返回只出现一次的那个数。你设计的解决方案必须满足O(logn)时间复杂度和O(1)空间复杂度。1.2.题目地址https://leetcode.cn/problems/single-ele......
  • Leetcode 275. H 指数 II
    1.题目基本信息1.1.题目描述给你一个整数数组citations,其中citations[i]表示研究者的第i篇论文被引用的次数,citations已经按照升序排列。计算并返回该研究者的h指数。h指数的定义:h代表“高引用次数”(highcitations),一名科研人员的h指数是指他(她)的(n篇论文中)至......
  • [LeetCode] 1497. Check If Array Pairs Are Divisible by k
    Givenanarrayofintegersarrofevenlengthnandanintegerk.Wewanttodividethearrayintoexactlyn/2pairssuchthatthesumofeachpairisdivisiblebyk.ReturntrueIfyoucanfindawaytodothatorfalseotherwise.Example1:Input:arr......
  • ABC225F String Cards
    题意给你\(n\)个串\(s_i\),你需要选出\(k\)个串并按照某个顺序拼接起来形成的字符串字典序最小。\(n,k,|s|\le50\)。分析由于顺序不固定,所以我们无法直接DP。而状压的复杂度也太高了,怎么办呢?考虑钦定一个顺序,使得按照这个顺序排列字符串一定最优。一个经典的错误想法......