【剑斩OFFER】算法的暴力美学——重排链表

一、题目描述

二、算法原理

思路:

1)使用快慢指针来找到链表的中间结点

2)把中间结点(不包含中间结点)后面的链表进行逆转

3)合并两个链表

三、代码实现

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:
    void reorderList(ListNode* head) {
        //找中间结点
        ListNode* slow = head,*fast = head;//快慢指针来找中间结点
        while(fast != nullptr && fast->next != nullptr)
        {
            slow = slow->next;
            fast = fast->next->next;
        }
        //此时 slow 就是中间结点,如果是偶数链表:1 2 3 4 此时 slow 指向的就是 3
        //逆转中间结点后面的链表
        ListNode* tmp = slow->next;
        slow->next = nullptr;
        slow = tmp;

        ListNode* prev = slow;
        if(prev == nullptr) return;//如果链表只有两个结点时,此时的 slow 是会越界的
        if(slow->next != nullptr)
        {
            ListNode* cur = prev->next;
            prev->next = nullptr;
            while(cur)
            {
                ListNode* tmp = cur->next;
                cur->next = prev;
                prev = cur;
                cur = tmp;
            }
        }
        //此时 prev 就是逆转后的表头
        //合并两个链表
        while(prev)
        {
            ListNode* tmp = head->next;
            ListNode* prevnext = prev->next;
            head->next = prev;
            prev->next = tmp;
            head = tmp;
            prev = prevnext;
        }
    }
};
相关推荐
阳明山水12 分钟前
因果嵌入与流水线范式的本质差异
人工智能·深度学习·算法·机器学习·架构
小静AI工程实验室16 分钟前
MD5 算法详解:哈希原理、标准向量、输入编码与安全边界
算法·安全·哈希算法·md5
小许同学记录成长17 分钟前
几何体编辑算法
qt·算法
土星云SaturnCloud26 分钟前
HRNet-pose 算法全解析:从高分辨率网络原理到土星云 SE110S 边缘部署实战
服务器·人工智能·算法·ai·边缘计算
bksczm29 分钟前
零基础面试题1
jvm·数据结构·算法
m0_7393128732 分钟前
【自动驾驶与机器人技术】之惯性导航与组合导航
算法·机器人·自动驾驶
驭渊的小故事39 分钟前
牛客网算法刷题笔记:哈希表、贪心与动态规划实战
笔记·算法·散列表
careathers1 小时前
【数据结构】二叉树
数据结构·算法
Omics Pro2 小时前
空间组学!医学代谢显微工具
数据库·人工智能·算法·机器学习·自然语言处理
Coder-magician2 小时前
《代码随想录》刷题打卡day44:图论-part02
算法·深度优先·图论