Leetcode——链表:143.重排链表

题目

思路

首先考虑特殊情况,链表为空,或者链表只有一个元素,此时直接返回

找到中间位置,将后半部分的链表翻转,得到新链表,将后半部分链表的节点交替插入原链表

寻找链表中间节点

使用快慢指针法

设置一个快指针,一个慢指针,初始均指向链表头节点

慢指针一次向后移动一个节点,快指针一次向后移动两个节点

当快指针移动到结尾时,慢指针指向前半条链表的最后一个节点

设置一个中间节点,中间节点为慢指针的下一个

断开前后两部分链表,慢指针的下一个指向空

原地翻转链表

设置三个变量prev,curr,next

设置循环处理全部链表中的节点,将当前元素的后继改为原链表的前驱(此时当前元素与原链表的后继断开,造成后继链表中全部节点丢失)

更新三个变量,处理下一个节点,将当前元素变为prev,将next改为当前元素,将next向后移动一个节点

当移动到最后一个元素时,把当前节点直接插入到原链表的头,更新并返回新链表的头

合并两个链表

设置新链表的尾指针,初始值设为指向第一个链表的头节点

将第一条链表的头指针设为链表中的第二个节点

先将第二个链表的头节点插入第一个链表中,尾向后移动,第二个链表的头节点向后移动

将第一个链表的第二个节点连接到尾后,尾向后移动,第一个节点指针向后移动

代码

寻找链表中间节点

传入值:链表头节点

传出值:后半部分链表的头节点

复制代码
ListNode* midList(ListNode* head)
    {
        ListNode* fast=head;
        ListNode* slow=head;

        while(fast->next!=nullptr&&fast->next->next!=nullptr)
        {
            fast=fast->next->next;
            slow=slow->next;
        }
        ListNode* MidNode=slow->next;
        slow->next=nullptr;
        return MidNode;
    }

原地翻转链表

传入值:链表头节点

传出值:新链表头节点

复制代码
ListNode* reverseList(ListNode* head)
    {
        ListNode* prev=nullptr;
        ListNode* curr=head;
        ListNode* next=curr->next;

        while(next!=nullptr)
        {
            curr->next=prev;

            prev=curr;
            curr=next;
            next=next->next;
        }

        curr->next=prev;
        prev=curr;

        return prev;
    }

交替合并两个链表

复制代码
void mergeList(ListNode* list1_head,ListNode* list2_head)
    {
        ListNode* newListTail=list1_head;
        list1_head=list1_head->next;
        while(list1_head!=nullptr&&list2_head!=nullptr)
        {
            newListTail->next=list2_head;
            newListTail=newListTail->next;
            list2_head=list2_head->next;

            newListTail->next=list1_head;
            newListTail=newListTail->next;
            list1_head=list1_head->next;
        }
        newListTail->next=list2_head;
    }

主函数

复制代码
void reorderList(ListNode* head) {
        if(head==nullptr||head->next==nullptr)return;

        ListNode* secondList=midList(head);
        secondList=reverseList(secondList);
        mergeList(head,secondList);
    }
相关推荐
H.莓飛3 分钟前
【数据结构】队列_OJ题
linux·数据结构·centos
-dzk-9 分钟前
【堆】LC 347.前 K 个高频元素
算法·堆
IT_陈寒18 分钟前
SpringBoot启动慢得像蜗牛?原来是这个配置在捣鬼
前端·人工智能·后端
H.莓飛19 分钟前
【数据结构】栈_OJ题
linux·数据结构·算法·centos
Zootopia62633 分钟前
多架 eVTOL集群排班调度方案思考
人工智能·算法·数学建模·matlab·动态规划·无人机·evtol
可乐ea41 分钟前
GitHub Security Lab 开源 Fuzzing Taskflow:让 LLM 智能体自己跑完 C/C++ 模糊测试
jvm·c++·github·模糊测试·mcp·代码agent·智能体自动化
和裕1 小时前
年度框架直供 vs 零散按需采购:定制纸箱采购成本、交付与服务核心区别全对比
大数据·运维·网络·人工智能·算法
朝朝辞暮i1 小时前
C++ 第 13 课:值传递 —— 为什么函数里改了,外面却没变?
java·c++·算法
淡海水1 小时前
02-02-原理篇-分代GC
算法·unity·c#·游戏引擎·.net·gc
平行侠1 小时前
065 B树(B-Tree)
数据结构·b树·树查找