LeetCode 刷题【24. 两两交换链表中的节点、25. K 个一组翻转链表】

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

自己做

解:直接置换

cpp 复制代码
/**
 * 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* swapPairs(ListNode* head) {
        
        ListNode *p = head;

        if(p == nullptr)                //空链表
            return nullptr;

        if(p->next == nullptr)          //只有一个元素
            return head;

        //先交换前两位
        ListNode *q = p->next; 
        ListNode *r = q->next;

        p->next = r;               
        q->next = p;
        head = q;       //更新头指针指向的结点
        
        q = p->next;
        if(q != nullptr)
            r = q->next;
        else
            r = nullptr;

        //三英杰就位,交换?启动!
        while(r != nullptr){
            //交换
            p->next = r;
            q->next = r->next;
            r->next = q;

            //更新pqr位置
            p = q;
            q = p->next;

            if(q == nullptr)
                break;

            r = q->next;

        }
        
        return head;

    }
};

25. K 个一组翻转链表

自己做

解:头插反转合并

cpp 复制代码
/**
 * 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) {
        ListNode *p = head;
        ListNode *r = new ListNode();       //头插
        
        //统计链表长度
        int len = 0;
        while(p != nullptr){
            p = p->next;
            len++;
        }

        if(len < k)               //连一组k都凑不出来
            return head;
        
        if(k == 1)                  //不用交换
            return head;

        //先处理第一组
        p = head;                   //重置指针p(上面用来统计长度了)
        ListNode *q = p->next;
        ListNode *tail = p;                //重新排序好的链表尾指针
        for(int i = 0; i < k; i++){     
            p->next = r->next;          //头插
            r->next = p;

            p = q;
            if(p != nullptr)
                q = q->next;
        }

        head = r->next;                 //重置头结点

        len -= k;                       //长度更新(这个长度表示剩下要排序的元素个数)

        while(len >= k){
            r->next = nullptr;          //重置头插链表
            ListNode *end = p;          //end指向头插链表的尾部

            for(int i = 0; i < k; i++){     
                p->next = r->next;          //头插
                r->next = p;

                p = q;
                if(p != nullptr)
                    q = q->next;
            }

            //现在r指向的头插链表又填装好了,p也指向了下一组的起始位置
            tail->next = r->next;           //反转的部分和原先的链表合并(head指向的)
            tail = end;                     //更新tail

            len -= k;                   //更新长度
        }

        //凑不成一组的部分合并
        tail->next = p;

        return head;

    }
};
相关推荐
地平线开发者3 分钟前
征程 6X | 常用工具介绍
算法·自动驾驶
地平线开发者20 分钟前
理想汽车智驾方案介绍 2|MindVLA 方案详解
算法·自动驾驶
艾莉丝努力练剑1 小时前
【C语言16天强化训练】从基础入门到进阶:Day 7
java·c语言·学习·算法
地平线开发者1 小时前
LLM 中评价指标与训练概要介绍
算法·自动驾驶
Ghost-Face2 小时前
关于并查集
算法
flashlight_hi3 小时前
LeetCode 分类刷题:2529. 正整数和负整数的最大计数
python·算法·leetcode
花火|3 小时前
算法训练营day60 图论⑩ Bellman_ford 队列优化算法、判断负权回路、单源有限最短路
算法·图论
2501_924890523 小时前
商超场景徘徊识别误报率↓79%!陌讯多模态时序融合算法落地优化
java·大数据·人工智能·深度学习·算法·目标检测·计算机视觉
艾醒3 小时前
大模型面试题剖析:模型微调和蒸馏核心技术拆解与考点梳理
算法
艾醒4 小时前
大模型面试题剖析:微调与 RAG 技术的选用逻辑
算法