链表-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;
    }
};

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

相关推荐
小熳芋30 分钟前
验证二叉搜索树- python-递归&上下界约束
数据结构
不穿格子的程序员4 小时前
从零开始写算法——链表篇2:从“回文”到“环形”——链表双指针技巧的深度解析
数据结构·算法·链表·回文链表·环形链表
诺....5 小时前
C语言不确定循环会影响输入输出缓冲区的刷新
c语言·数据结构·算法
Tisfy5 小时前
LeetCode 3531.统计被覆盖的建筑:最大最小值
算法·leetcode·题解·桶排序
月明长歌5 小时前
【码道初阶】Leetcode.189 轮转数组:不熟悉ArrayList时踩得坑,被Arraylist初始化骗了?
java·算法·leetcode·职场和发展
fantasy_arch5 小时前
leetcode算法-最大乘积子数组
算法·leetcode·职场和发展
长安er6 小时前
LeetCode876/141/142/143 快慢指针应用:链表中间 / 环形 / 重排问题
数据结构·算法·leetcode·链表·双指针·环形链表
workflower6 小时前
PostgreSQL 数据库的典型操作
数据结构·数据库·oracle·数据库开发·时序数据库
仰泳的熊猫7 小时前
1140 Look-and-say Sequence
数据结构·c++·算法·pat考试