链表-143.重排链表-力扣(LeetCode)

一、题目解析

1、不能单纯改变节点内部的值,要改变节点的指针

2、节点个数为[1,5*10^4]

二、算法原理

解法:模拟

对于上面的重排,我们可以将其拆解为两个链表合并,后面一个链表需要逆置,而分割的位置正好处于原链表的中间节点,由此我们可以模拟这个过程来重拍链表

1、找到链表的中间节点

快慢指针法

2、把后面的部分逆置

三指针头插法
只需按顺序链接即可,newhead->next = slow,slow->next = tail,tail = slow

3、合并两个链表

以一个哨兵为头节点,依次尾插即可,最后delete哨兵位头节点即可

画图可以解决指针链接问题,链表问题建议多画图

三、代码示例

cpp 复制代码
class Solution {
public:
    void reorderList(ListNode* head)
    {
        ListNode* cur1 = head,*cur2 = head;
        //找中间
        while(cur2 && cur2->next)
        {
            cur1 = cur1->next;
            cur2 = cur2->next->next;
        }
        //逆序后面(头插三指针)
        ListNode* newhead2 = new ListNode();
        newhead2->next = cur1;
        ListNode* cnext = cur1->next;
        cur1->next = nullptr;
        while(cnext)
        {
            ListNode* nnext = cnext->next;
            newhead2->next = cnext;
            cnext->next = cur1;
            cur1 = cnext;
            cnext = nnext;
        }
        //合并
        ListNode* newhead1 = new ListNode();
        ListNode* tail = newhead1;
        while(cur1)
        {
            tail->next = head;
            tail = head;
            if(head->next == nullptr) break;
            head = head->next;
            tail->next = cur1;
            tail = cur1;
            cur1=cur1->next;
        }
        //释放哨兵位头节点
        delete newhead1;
        delete newhead2;
    }
};

看到最后,如果对您有所帮助,还请点赞、收藏和关注,我们下期再见!

相关推荐
Leiwenti28 分钟前
MySQL高阶篇-数据库优化
数据结构·数据库·mysql
7hhhhhhh1 小时前
自学嵌入式第二十四天:数据结构(4)-栈
数据结构
一起努力啊~1 小时前
算法题打卡力扣第34题:在排序数组中查找元素的第一个和最后一个位置(mid)
数据结构·算法·leetcode
快去睡觉~10 小时前
力扣73:矩阵置零
算法·leetcode·矩阵
岁忧10 小时前
(nice!!!)(LeetCode 每日一题) 679. 24 点游戏 (深度优先搜索)
java·c++·leetcode·游戏·go·深度优先
小欣加油10 小时前
leetcode 3 无重复字符的最长子串
c++·算法·leetcode
月盈缺13 小时前
学习嵌入式的第二十二天——数据结构——双向链表
数据结构·学习·链表
科大饭桶14 小时前
C++入门自学Day14-- Stack和Queue的自实现(适配器)
c语言·开发语言·数据结构·c++·容器
元亓亓亓15 小时前
LeetCode热题100--101. 对称二叉树--简单
算法·leetcode·职场和发展