首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >​LeetCode刷题实战143: 重排链表

​LeetCode刷题实战143: 重排链表

作者头像
程序员小猿
发布2021-01-19 11:23:33
发布2021-01-19 11:23:33
5430
举报
文章被收录于专栏:程序IT圈程序IT圈

今天和大家聊的问题叫做 重排链表,我们先来看题面:

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→…

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

样例

代码语言:javascript
复制
示例 1:

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

示例 2:

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

解题

大体上分为三步:

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

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

代码语言:javascript
复制
/**
 * 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;
        }
    }
};

好了,今天的文章就到这里。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员小猿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题意
  • 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档