C++实现LeetCode(143.链表重排序)

对于C++实现LeetCode题目,一般需要注意以下几个方面:

1.理解题目,找出其中的规律和特点。
2.选择适当的数据结构和算法,实现解题思路。
3.编写代码实现解题思路。
4.提交代码并检查题目结果。

下面我们来详细讲解如何用C++实现LeetCode(143.链表重排序)的完整攻略。首先,我们可以查看题目描述:

给定一个单链表 L 的头节点 head ,单链表 L 表示为:

L0 → L1 → … → Ln-1 → Ln
请将其重新排列后变为:

L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

从题目描述中可以看出,要求我们重新排列链表,将链表的头节点与尾节点相连接,依次从头结点和尾节点中取出节点,依次排列,直到中间节点为止。 因此,我们需要将链表分为两个部分,一部分是头节点和中间节点之前的节点,另一部分是中间节点和尾节点之间的节点,将这两个部分分别转化为顺序表,然后依次组合就可以得到最终结果。

接下来,我们可以来看看实现过程:

1.读入链表,并将节点存入数组中。

class Solution {
public:
    void reorderList(ListNode* head) {
        if (!head || !head->next) return;
        ListNode* cur = head;
        vector<ListNode*> vec;  // 存储所有节点
        while (cur) {
            vec.emplace_back(cur);
            cur = cur->next;
        }
        int n = vec.size();

2.将链表分为两个顺序表,并翻转后一个顺序表。

        for (int i = 0; i < n / 2; ++i) {
            vec[i]->next = vec[n - i - 1];
            vec[n - i - 1]->next = vec[i + 1];
        }
        vec[n / 2]->next = nullptr;
        ListNode* tail = vec[n / 2 + 1];
        reverse(vec.begin() + n / 2 + 1, vec.end());

3.将两个顺序表依次合并。

        cur = head;
        for (int i = 0; i < n; ++i) {
            ListNode* t = vec[i];
            if (cur == tail) break;
            t->next = cur->next;
            cur->next = t;
            cur = t->next;
        }
    }
};

接下来,我们来看一下示例:

示例1:

输入:1->2->3->4
输出:1->4->2->3

示例2:

输入:1->2->3->4->5
输出:1->5->2->4->3

对于示例1,我们将链表分为{1,2}和{4,3},然后倒置后一个顺序表得到{4,3},最后合并{1,4,2,3},得到最终结果。

对于示例2,我们将链表分为{1,2,3}和{5,4},然后倒置后一个顺序表得到{5,4},最后合并{1,5,2,4,3},得到最终结果。

最后,我们通过提交代码和检查题目结果来验证代码的正确性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现LeetCode(143.链表重排序) - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Python的ini配置文件你了解吗

    当我们在开发Python程序时,尤其是需要读取配置文件时,INI配置文件被广泛使用。下面是从头到尾完整的INI配置文件攻略,包含如何使用Python读取、写入、修改INI配置文件。 什么是INI文件 INI文件是一种纯文本文件格式,通常用作Windows操作系统中应用程序的配置文件。它的基本语法是以节(section)和键值对(key-value)的形式组织…

    other 2023年6月25日
    00
  • c++virtualvoidvsnovirtual

    C++中virtual和非virtual函数的区别 在C++中,virtual和非virtual函数的区别在于是否支持多态。本文将详细讲解virtual和非virtual函数的区别,包括使用场景、实现方式、示例等内容。 virtual函数 在C++中,virtual函数是支持多态的。当一个类中的函数被声明为virtual时,可以被子类重写,从而实现多态。以下…

    other 2023年5月8日
    00
  • [币严区块链]数字货币交易所之瑞波(xrp)钱包对接

    [币严区块链]数字货币交易所之瑞波(XRP)钱包对接 瑞波(XRP)是近年来备受关注的数字货币之一,其底层技术使得其具有高效、低成本、可扩展和安全的特性。而瑞波(XRP)的使用也需要钱包的支持。因此,币严区块链的数字货币交易所即将对瑞波(XRP)的钱包进行对接,方便用户的交易和管理。 为什么选择币严区块链 币严区块链作为行业内的佼佼者,其交易所具有以下特点:…

    其他 2023年3月29日
    00
  • markdownpad2下载安装教程

    MarkdownPad2下载安装教程 MarkdownPad2是一款Windows平台上的Markdown编辑器,它提供了一套完整的Markdown编辑和预览功能,支持实时预览、自定义样式、代码高亮等功能。本文将提供一个完整攻略,介绍MarkdownPad2的下载安装方法和注意事项,并提供两个示例说明。 下载安装方法 可以按照以下步骤下载和安装Markdow…

    other 2023年5月8日
    00
  • eclipse启动出现“failed to load the jni shared library”问题解决

    Eclipse启动出现\”failed to load the jni shared library\”问题解决攻略 当你尝试启动Eclipse时,可能会遇到\”failed to load the jni shared library\”错误。这个错误通常是由于Eclipse无法找到或加载Java Native Interface(JNI)共享库引起的。下…

    other 2023年8月3日
    00
  • 根据IP的地址,区分不同的地区,查看不同的网站页面的js代码

    根据IP地址区分不同地区的网站页面 要根据IP地址区分不同地区的网站页面,你可以使用以下步骤: 获取用户的IP地址:你可以使用服务器端编程语言(如Python、PHP等)或者客户端脚本(如JavaScript)来获取用户的IP地址。服务器端编程语言通常提供了获取用户IP地址的函数或方法,例如在Python中可以使用request.remote_addr来获取…

    other 2023年7月30日
    00
  • numpy库的下载及安装(吐血总结)

    numpy库的下载及安装(吐血总结) NumPy是Python中用于科学计算的重要库之一,该库提供了大量高级的数值编程工具,适用于任何需要进行数据处理和分析的应用场景。但是,有时候刚刚学习Python的初学者可能会对NumPy的下载和安装过程感到困惑。本文将在吐血总结的基础上,为需要安装NumPy库的读者提供一些帮助。 下载NumPy库 NumPy库最简单的…

    其他 2023年3月29日
    00
  • Android UI设计系列之自定义DrawView组件实现数字签名效果(5)

    首先,需要明确这篇文章的主要内容为如何通过自定义DrawView组件实现数字签名效果。为了实现这个目的,需要遵循以下步骤: 首先,在xml布局文件中创建DrawView组件,并设置其大小等参数。 <com.example.drawviewdemo.DrawView android:id="@+id/draw_view" androi…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部