打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
​LeetCode刷题实战143: 重排链表
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 重排链表,我们先来看题面:
https://leetcode-cn.com/problems/reorder-list/

Given a singly linked list L: L0→L1→…→Ln-1→Ln,

reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…

You may not modify the values in the list's nodes, only nodes itself may be changed.

题意


给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

样例

示例 1:

给定链表 1->2->3->4, 重新排列为 1->4->2->3.

示例 2:

给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.


解题


大体上分为三步:

  • 首先找到链表的中间位置,从其后面拆开分成两半,保存要反向插入的后半部分的首节点,并把前半部分的最后一个节点的next指针置为NULL

  • 然后将后半部分链表反转,并保存反转后新链表的首节点

  • 最后从反转后的链表首节点开始,依次间隔一个位置插入到前半部分链表中


本题代码用C++来演示,代码已经跑过验证过了,如下图所示

/**
 * Definition for singly-linked list.
 * struct ListNode {
 * int val;
 * ListNode *next;
 * ListNode(int x) : val(x), next(NULL) {}
 * };
 */

class Solution {
public:
    void reorderList(ListNode* head) {
        if(head == NULL || head->next == NULL) return;
        ListNode *left = head, *right = head;
        while(right){
            right = right->next;
            if(right){
                right = right->next;
                left = left->next;
            }
        }
        right = left->next;
        left->next = NULL;
        left = NULL;
        ListNode *now = right;
        while(now){
            right = now->next;
            now->next = left;
            left = now;
            now = right;
        }
        now = head;
        while(left){
            right = left->next;
            left->next = now->next;
            now->next = left;
            now = left->next;
            left = right;
        }
    }
};

好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力。

上期推文:

LeetCode1-140题汇总,希望对你有点帮助!
LeetCode刷题实战141: 环形链表
LeetCode刷题实战142: 环形链表 II

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
LeetCode第141题
每日一题 剑指offer(反转列表)
[leetcode 206] Reverse Linked List
LeetCode实战:两两交换链表中的节点
328 LeetCode:Odd Even Linked List - 链表内元素按奇偶位置重新排序
看一遍就理解,图解单链表反转
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服