链表--链表的一个技巧

news2024/11/28 2:55:10

少年的书桌上没有虚度的光阴

2024.10.5

大家好,我是小苏。

今天给大家分享一下近期我刷力扣链表题的一个技巧!

我们知道,链表数组的重要区别之一是:

链表不支持随机访问,数组支持

我们可以根据这一特性:把链表当中的值放入数组当中,对数组进行操作。然后再把数组的值返还给链表。

这样做既有优点也有缺点

优点是:可以避免复杂的指针移动,操作简单

缺点是,空间复杂度高,违背出题人的本意

注:这种方法虽然比较low,可能也违背了出题人的本意,但是如果在去公司机试的时候,如果这种方法能够很快的通过 当然是最好的,如果不行,再用通法。

力扣的一大部分题目用这种方法可以解决。

具体例子

206.反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]

思路:

  • 创建一个vectorv,遍历链表,把链表的值插入到v当中
  • 反转数组,可以使用reverse函数
  • 把v当中的值插入到链表当中

代码:

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        vector<int>v;
        for(auto p=head;p!=NULL;p=p->next){
            v.push_back(p->val);
        }
        reverse(v.begin(),v.end());
        int i=0;
        for(auto p=head;p!=NULL;p=p->next){
            p->val=v[i];
            i++;
        }
        return head;
    }
};

图解:

148.排序链表

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。

输入:head = [4,2,1,3] 输出:[1,2,3,4] 示例 2:

思路:

  • 创建一个数组v,遍历链表,把链表的值插入到v当中
  • 使用sort进行排序
  • 把v当中的值插入到链表当中

代码:

class Solution {
public:
    ListNode* sortList(ListNode* head) {
        vector<int>ans;
        ListNode newhead;
        newhead.next=head;
        ListNode*p=head;
        for(ListNode*p=head;p!=NULL;p=p->next)
        {
            ans.push_back(p->val);
        }
        sort(ans.begin(),ans.end());
        int i=0;
        for(ListNode*p=head;p!=NULL,i<ans.size();p=p->next,i++){
            p->val=ans[i];  
        }
        return newhead.next;
    }
};

图解:

23.合并K个升序链表

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例 1:
输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
  1->4->5,
  1->3->4,
  2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6

思路:

  • 使用STL的list容器,并使用merge函数进行合并
  • 把list当中的数据给一个数组
  • 最后把数组的元素放入重新构建的一个链表当中

代码:

class Solution {
public:
   static void Insert_tail(ListNode*head,int val)
    {
        auto p=new ListNode(val);
        auto q=head;
        for(;q->next!=NULL;q=q->next)
        {
            ;
        }
        p->next=q->next;
        q->next=p;
    }
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        //使用STL的list容器
        list<int>ans;
        for(auto l:lists)
        {
            list<int>tmp;
            for(auto p=l;p!=NULL;p=p->next)
            {
                tmp.push_back(p->val);
            }
            ans.merge(tmp);
            tmp.clear();
        }
        //把list当中的数据给vector
        vector<int>v;
        for(auto it=ans.begin();it!=ans.end();it++)
            v.push_back(*it);
        //创建一个新的表头
        auto head=new ListNode(0);
        for(int i=0;i<v.size();i++)
        {
            Insert_tail(head,v[i]);
        }
        return  head->next;
    }
};

图解:

234.回文链表

给你一个单链表的头节点 head ,请你判断该链表是否为 回文链表 。如果是,返回 true ;否则,返回 false 输入:head = [1,2,2,1] 输出:true

思路:

  • 创建一个vectorv遍历链表,把链表的值插入到v
  • 判断数组是否是回文数组
  • 把v当中的值插入到链表当中

代码:

class Solution {
public:
    bool isPalindrome(ListNode* head) {
        vector<int>ans;
        ListNode newhead;
        for(ListNode*p=head;p!=NULL;p=p->next)
        {
            ans.push_back(p->val);
        }
        int i=0;
        int j=ans.size()-1;
        while(i<j)
        {
            if(ans[i]!=ans[j])
                return false;
            else
            {
                i++;
                j--;
            }
        }
        return true;
    }
};

图解:

  1. 重排链表

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

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

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

输入:head = [1,2,3,4] 输出:[1,4,2,3]

思路:和上面类似,也是可以先把链表当中的值放入数组当中,然后对数组进行操作。

代码:

class Solution {
public:
    void reorderList(ListNode* head) {
        if (!head || !head->next) {
            return; // 空链表或只有一个节点的链表无需处理
        }
        // 1. 将链表节点值存入数组
        vector<int> values;
        ListNode* current = head;
        
        while (current) {
            values.push_back(current->val);
            current = current->next;
        }
        int n = values.size();       
        // 2. 重新排列数组
        vector<int> reorderedValues;
        int left = 0;
        int right = n - 1;     
        while (left <= right) {
            if (left <= right) {
                reorderedValues.push_back(values[left]);
                left++;
            }
            if (right >= left) {
                reorderedValues.push_back(values[right]);
                right--;
            }
       }
        // 3. 重构链表
        current = head;
        for (int val : reorderedValues) {
            current->val = val;
            current = current->next;
        }
    }
};

总结

我们可以根据链表不支持随机访问,数组支持随机访问的特点,把链表当中的数据先拷贝到数组当中,对数组进行一系列的操作,再把数组的内容拷贝到链表当中,这种方法可以解决力扣当中大部分的题目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2192504.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

信息安全工程师(35)访问控制类型

前言 访问控制是几乎所有系统&#xff08;包括计算机系统和非计算机系统&#xff09;都需要用到的一种技术&#xff0c;它基于用户身份及其所归属的某项定义组来限制用户对某些信息项的访问&#xff0c;或限制对某些控制功能的使用。 一、自主访问控制&#xff08;DAC&#xff…

ElasticSearch备考 -- Search across cluster

一、题目 配置两个集群&#xff0c;集群名称为my-application-01、my-application-02&#xff0c;导入es自带Sample flight data数据集&#xff0c;配置扩集群检索&#xff0c;查询数据 二、思考 准备工作有两个集群&#xff0c;并需要对集群配置角色中增加 remote_cluster_cl…

物联网智能设备:未来生活的变革者

文章目录 引言什么是物联网智能设备&#xff1f;技术架构应用场景挑战与解决方案未来发展趋势结论 引言 随着科技的迅猛发展&#xff0c;物联网&#xff08;IoT&#xff09;正在改变我们生活的方方面面。从智能家居到工业自动化&#xff0c;物联网智能设备正在逐步融入我们的日…

AI应用的东风,奥特曼不想错过

文&#xff5c;魏琳华 编&#xff5c;王一粟 作为炙手可热的AI公司&#xff0c;Open AI又一次拿到了一轮足以令对手眼红的巨额融资。10月2日&#xff0c;Open AI宣布顺利完成66亿美元融资&#xff0c;补上了烧钱研发亏损的同时&#xff0c;还为下一轮竞争拿到了资金支持。 跻…

【电商搜索】现代工业级电商搜索技术-中科院计算机研究所-生成型检索与多级相关性相结合

【电商搜索】现代工业级电商搜索技术-中科院计算机研究所-生成型检索与多级相关性相结合 目录 文章目录 【电商搜索】现代工业级电商搜索技术-中科院计算机研究所-生成型检索与多级相关性相结合目录0. 论文信息1. 摘要2. 研究背景3. 主要挑战4. 创新点5. 算法模型1. **标识符设…

还在“卷”长度?长文本模型真的基于上下文进行回复吗?

近年来&#xff0c;随着长文本模型&#xff08;Long-context Model, LCM&#xff09;技术的突飞猛进&#xff0c;处理长上下文的能力已成为各大语言模型&#xff08;Large Language Model, LLM&#xff09;的核心竞争力&#xff0c;也是各大技术厂商争夺的焦点。截至2023年12月…

SystemC学习(1)— SystemC安装与HelloWorld

SystemC学习&#xff08;1&#xff09;— SystemC安装与HelloWorld 一、前言 参考文档&#xff1a; 1、ubuntu系统安装systemc-2.3.4流程 2、SystemC语言学习笔记 3、SystemC资料2.ppt 4、SystemC入门笔记 二、安装包下载与安装 我们可以直接从官网下载SystemC的库安装包&a…

多字节字符集CString转换string

实现函数如下&#xff1a; std::string CStringToUTF8(const CString& str) {// Step 1: 将 MBCS (GBK) CString 转换为宽字符&#xff08;WCHAR&#xff09;int wideLen MultiByteToWideChar(CP_ACP, 0, str.GetString(), -1, NULL, 0);if (wideLen < 0)return "…

组件中$router/$route的由来(vue-router源码分析)

1.vue-router源码下载 我们可以到github上找到对应版本的vue-router 版本号可以到项目中的node_modules/vue-router/dist/vue-router.js查看嘴上面的许可证说明(package.json只提供了版本的大致范围 ^表示2.2.x 而~表示2.x.x 都为>的含义) 在github上的vue-router我们要选择…

一个月学会Java 第2天 认识类与对象

Day2 认识类与对象 第一章 初识类 经过一个程序的编写&#xff0c;应该对程序的结构有点好奇了吧&#xff0c;如果你有基础&#xff0c;接下来的肯定非常的易懂&#xff0c;如果你没有基础也没有关系&#xff0c;反复琢磨一下也就懂了&#x1f606; 我们来重复一下第一个程序 …

Vivado - JTAG to AXI Master (DDR4)

目录 1. 简介 2. JTAG 直接操作 DDR4 2.1 Block Design 2.2 AXI SmartConnect 2.3 DDR4 MIG 2.3.1 时钟和复位 2.3.2 AXI Slave 接口 2.4 XDC 约束 2.5 TCL 代码 2.5.1 写入 DDR4 2.5.2 读取 DDR4 3. HLS IP 操作 DDR4 3.1 Block Design 3.2 HLS IP 3.2.1 HLS 代…

TypeScript面向对象 01

使用class关键字来定义一个类。对象中主要包含了两个部分&#xff1a;属性和方法。 class Person {// 定义实例属性name:string glm;age:number 1234; } const a new Person(); console.log(a.name);在属性前使用static关键字可以定义类属性&#xff08;静态属性&#xff0…

Sebastian Raschka 最新博客:从头开始用 Llama 2 构建 Llama 3.2

最近已有不少大厂都在秋招宣讲了&#xff0c;也有一些在 Offer 发放阶段。 节前&#xff0c;我们邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对新手如何入门算法岗、该如何准备面试攻略、面试常考点、大模型技术趋势、算法项目落地经验分享等热门话题进行了…

自动驾驶-问题笔记-待解决

参考线的平滑方法 参考线平滑算法主要有三种&#xff1a; 离散点平滑&#xff1b;螺旋曲线平滑&#xff1b;多项式平滑&#xff1b; 参考链接&#xff1a;参考线平滑 对于平滑方法&#xff0c;一直不太理解平滑、拟合以及滤波三者的作用与区别&#xff1b; 规划的起点&#x…

代码随想录一刷完结

非常偶然的机会让我看到这个算法训练营的存在&#xff0c;虽然我也没有多大的动力&#xff0c;但当时就觉得没什么事情&#xff0c;想着刷刷题&#xff0c;为以后找工作打打基础。 收获 提示&#xff1a;在刷题过程中的收获 第一次使用CSDN记录&#xff0c;每次有别人点赞和收…

【React】事件机制

事件机制 react 基于浏览器的事件机制自身实现了一套事件机制&#xff0c;称为合成事件。比如&#xff1a;onclick -> onClick 获取原生事件&#xff1a;e.nativeEvent onClick 并不会将事件代理函数绑定到真实的 DOM节点上&#xff0c;而是将所有的事件绑定到结构的最外层…

【LeetCode: 134. 加油站 | 贪心算法】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

AI模型部署初认识

AI部署这个词儿大家肯定不陌生&#xff0c;可能有些小伙伴还不是很清楚这个是干嘛的&#xff0c;但总归是耳熟能详了。 近些年来&#xff0c;在深度学习算法已经足够卷卷卷之后&#xff0c;深度学习的另一个偏向于工程的方向–部署工业落地&#xff0c;才开始被谈论的多了起来…

C语言 | Leetcode C语言题解之第456题132模式

题目&#xff1a; 题解&#xff1a; int upper_bound(int* vec, int vecSize, int target) {int low 0, high vecSize - 1;if (vec[high] > target) {return -1;}while (low < high) {int mid (high - low) / 2 low;int num vec[mid];if (num > target) {low m…

IDEA基础开发配置以及和git的联动

1.1方向一&#xff1a;工具介绍 我今天要介绍的就是学习Java大部分情况下都会选择的一款工具-----IDEA&#xff0c;这个和我们熟悉的这个pycharm一样&#xff0c;都是属于这个Jetbrains公司的&#xff0c;虽然我对于这个并不是很了解&#xff0c;但是确实知道一点&#xff0c;…