LeetCode 热题 C++ 148. 排序链表 152. 乘积最大子数组 160. 相交链表

news2024/10/1 9:34:45

力扣148

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

示例 1:

 

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

示例 2:

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

示例 3:

输入:head = []
输出:[]

提示:

  • 链表中节点的数目在范围 [0, 5 * 104] 内
  • -105 <= Node.val <= 105

 思路:

理论上来说,如果要时间复杂度O(nlogn)时间复杂度为O(1)的话,是堆排序。

但是归并排序自底向上也可以。

没睡好脑子有点乱,先写个普通的归并过一下,之后再补坑。

代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        ListNode* p1=list1;
        ListNode* p2=list2;
        ListNode* p3=new ListNode();
        ListNode* ans=p3;
        while(p1&&p2)
        {
            ListNode* k=new ListNode();
            if(p1->val<=p2->val){
                k->val=p1->val;
                p1=p1->next;
            }
            else {
                k->val=p2->val; 
                p2=p2->next;
            }
            p3->next=k;
            p3=p3->next;
        }
        if(p1)
        {
            p3->next=p1;
        }
        if(p2)
        {
            p3->next=p2;
        }
        return ans->next;
    }
    ListNode* sortList(ListNode* head) {
        if(!head||!head->next)return head;
        ListNode* p1=head;
        ListNode* p2=head;
        while(p2->next&&p2->next->next){
            p1=p1->next;
            p2=p2->next->next;
        }
        p2=p1->next;
        p1->next=nullptr;
        return mergeTwoLists(sortList(head),sortList(p2));
    }
};

力扣152

给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。

测试用例的答案是一个 32-位 整数。

子数组 是数组的连续子序列。

示例 1:

输入: nums = [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。

示例 2:

输入: nums = [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

提示:

  • 1 <= nums.length <= 2 * 104
  • -10 <= nums[i] <= 10
  • nums 的任何前缀或后缀的乘积都 保证 是一个 32-位 整数

 思路:

最大连续乘积和最大连续和还是不一样的,因为只要全部是正数,或者有偶数个负数,在没有0的情况下只要全部乘起来就是最大的。

所以我们用一个mmin存储最小值,用mmax存储最大值,如果遇到当前数字是负数的情况,就把mmin和mmax互换。

代码:

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int mmax=nums[0];
        int mmin=nums[0];
        int MMAX=nums[0];
        for(int i=1;i<nums.size();i++)
        {
            if(nums[i]<0)swap(mmin,mmax);
            mmin=min(nums[i],mmin*nums[i]);
            mmax=max(nums[i],mmax*nums[i]);
            MMAX=max(mmax,MMAX);
        }
        return MMAX;
    }
};

力扣160

给你两个单链表的头节点 headAheadB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null

图示两个链表在节点 c1 开始相交

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构

自定义评测:

评测系统 的输入如下(你设计的程序 不适用 此输入):

  • intersectVal - 相交的起始节点的值。如果不存在相交节点,这一值为 0
  • listA - 第一个链表
  • listB - 第二个链表
  • skipA - 在 listA 中(从头节点开始)跳到交叉节点的节点数
  • skipB - 在 listB 中(从头节点开始)跳到交叉节点的节点数

评测系统将根据这些输入创建链式数据结构,并将两个头节点 headAheadB 传递给你的程序。如果程序能够正确返回相交节点,那么你的解决方案将被 视作正确答案

示例 1:

https://assets.leetcode.com/uploads/2018/12/13/160_example_1.png

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3
输出:Intersected at '8'
解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。
在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
— 请注意相交节点的值不为 1,因为在链表 A 和链表 B 之中值为 1 的节点 (A 中第二个节点和 B 中第三个节点) 是不同的节点。换句话说,它们在内存中指向两个不同的位置,而链表 A 和链表 B 中值为 8 的节点 (A 中第三个节点,B 中第四个节点) 在内存中指向相同的位置。

示例 2:

输入:intersectVal = 2, listA = [1,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
输出:Intersected at '2'
解释:相交节点的值为 2 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [1,9,1,2,4],链表 B 为 [3,2,4]。
在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。

示例 3:

输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
输出:null
解释:从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。
由于这两个链表不相交,所以 intersectVal 必须为 0,而 skipA 和 skipB 可以是任意值。
这两个链表不相交,因此返回 null 。

提示:

  • listA 中节点数目为 m
  • listB 中节点数目为 n
  • 1 <= m, n <= 3 * 104
  • 1 <= Node.val <= 105
  • 0 <= skipA <= m
  • 0 <= skipB <= n
  • 如果 listAlistB 没有交点,intersectVal0
  • 如果 listAlistB 有交点,intersectVal == listA[skipA] == listB[skipB]

进阶:你能否设计一个时间复杂度 O(m + n) 、仅用 O(1) 内存的解决方案?

思路:

题目巴拉巴拉一长串,其实就是找两个链表相交的结点。

只要两个链表会相交,那么它们尾结点一定是相同的,遍历一遍长度,把长的链表多的部分先走掉,然后一起走,看哪个点相同就好了。

代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* fun(ListNode* p,ListNode* q,int t)
    {
        while(t--)
        {
            p=p->next;
        }
        while(p&&q)
        {
            if(p==q)return p;
            p=p->next;
            q=q->next;
        }
        return NULL;
    }
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode* p=headA;
        ListNode* q=headB;
        int l1=0,l2=0;
        while(p)
        {
            l1++;
            p=p->next;
        }
        while(q)
        {
            l2++;
            q=q->next;
        }
        if(l1>=l2)return fun(headA,headB,l1-l2);
        else return fun(headB,headA,l2-l1);
    }
};

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

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

相关文章

php mysql校园帮忙领取快递平台

1、后台管理员用户名hsg 密码hsg 2、开发语言&#xff1a;PHP&#xff0c;数据库为MySql 3、数据库连接字符串在conn.php中修改 4、运行环境wamp5.1.7或者appserv2.5.9 5.程序编码gbk.不支持php5.3以上版本 6.本人发布的程序一律享有免费运行一次…

西安银行就业总结

引 进银行性价比最高的时刻是本科&#xff0c;研究生的话可以去需要研究生较多的银行&#xff0c;比如邮储或者证券类的中信建投。中信建投很香&#xff0c;要求本硕西电。研究生学历的话&#xff0c;一般情况下银行不会卡本科&#xff0c;只看最高学历&#xff0c;部分银行需…

内核并发消杀器(KCSAN)技术分析

一、KCSAN介绍KCSAN(Kernel Concurrency Sanitizer)是一种动态竞态检测器&#xff0c;它依赖于编译时插装&#xff0c;并使用基于观察点的采样方法来检测竞态&#xff0c;其主要目的是检测数据竞争。KCSAN是一种检测LKMM(Linux内核内存一致性模型)定义的数据竞争(data race)的工…

网络应用之URL

URL学习目标能够知道URL的组成部分1. URL的概念URL的英文全拼是(Uniform Resoure Locator),表达的意思是统一资源定位符&#xff0c;通俗理解就是网络资源地址&#xff0c;也就是我们常说的网址。2. URL的组成URL的样子:https://news.163.com/18/1122/10/E178J2O4000189FH.html…

最好的个人品牌策略是什么样的

在这个自我营销的时代&#xff0c;个人品牌越来越受到人们的重视。您的个人品牌的成功与否取决于您在专业领域拥有的知识&#xff0c;以及拥有将这些知识传达给其他用户的能力。如果人们认为您没有能力并且无法有效地分享有用的知识&#xff0c;那么您就很难获得关注并实现长远…

树莓派Linux内核配置

文章目录一、嵌入式带操作系统的启动过程二、Linux内核源码树扫盲分析三、树莓派Linux源码配置1.树莓派Linux的内核配置2.树莓派Linux内核编译3、更换树莓派内核一、嵌入式带操作系统的启动过程 1.x86&#xff0c;Intel的启动过程&#xff1a; 电源上电->BIOS->Windows内…

PHP基础(2)

PHP基础常用函数数组及多维数组数组遍历强制类型转换运算符赋值与基本运算字符串运算逻辑运算符常用函数 substr的用法是&#xff1a;substr&#xff08;目标字符串&#xff0c;从字符串的哪个位置开始&#xff0c;然后返回往后的几个字符&#xff09;strchr的用法是&#xff1…

【华为OD机试模拟题】用 C++ 实现 - 滑动求和(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

几张图带你看懂Unicode和UTF-8

一、二进制 为什么要编码&#xff1f; 在计算机中&#xff0c;所有的数据在存储和运算时都要使用二进制数表示&#xff08;因为计算机用高电平和低电平分别表示1和0&#xff09; 我们用QQ给其他人发消息、发文件、发表情&#xff0c;最终会以二进制形式在网路中传输&#xff…

【多线程与高并发】- 浅谈volatile

浅谈volatile简介JMM概述volatile的特性1、可见性举个例子总结2、无法保证原子性举个例子分析使用volatile对原子性测试使用锁的机制总结3、禁止指令重排什么是指令重排序重排序怎么提高执行速度重排序的问题所在volatile禁止指令重排序内存屏障(Memory Barrier)作用volatile内…

验证性因子分析(CFA)全流程

案例与数据 某研究者想要研究关于教师懈怠感的课题&#xff0c;教师懈怠感是指教师在教育情境的要求下&#xff0c;由于无法有效应对工作压力与挫折而产生的情绪低落、态度消极状态&#xff0c;这种状态甚至会引发心理、生理的困扰&#xff0c;终至对教育工作产生厌倦&#xf…

实例8:机器人的空间描述和变换仿真

实例8&#xff1a;机器人的空间描述和变换仿真 实验目的 通过刚体与刚体的平动、转动基础知识的学习&#xff0c;熟悉位姿的描述通过Python编程实践&#xff0c;可视化学习坐标系的变换&#xff0c;熟悉空间变换 实验要求 建立一个原点位于零点的三维正交坐标系&#xff0c…

SQL零基础入门学习(十二)

SQL零基础入门学习&#xff08;SQL约束&#xff09; SQL CREATE INDEX 语句 CREATE INDEX 语句用于在表中创建索引。 在不读取整个表的情况下&#xff0c;索引使数据库应用程序可以更快地查找数据。 索引 您可以在表中创建索引&#xff0c;以便更加快速高效地查询数据。 用…

WooCommerce 上传文件 Vanquish v71.6

今天用wp 搭一个b2c外贸跨境电商网站 找 了一个文件上传插件&#xff0c;可以 上传无限数量的文件&#xff0c;没有文件大小限制WooCommerce 上传文件允许您上传无限数量的文件&#xff0c;没有任何文件大小限制。得益于其创新的块上传技术&#xff0c;它可以不受限制地上传任何…

【华为OD机试模拟题】用 C++ 实现 - 数据分类(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

记一次SSM项目启动过程中遇到的问题(找不到符号)

最近拿了朋友的SSM项目过来参考一下开发过程&#xff0c;然后我这边个人情况是没有学过Java的&#xff0c;环境也不太清楚&#xff0c;虽然之前有在学校过程中做过一个旅游网站类似的SSM项目&#xff0c;电脑环境配置还是有些不太了解&#xff0c;bug修了2天大概&#xff0c;然…

windows下编译leveldb(动态库+静态库)

环境准备 1&#xff09;下载cmake并安装 下载路径: https://cmake.org/download/2&#xff09;下载leveldb源码 git clone https://github.com/google/leveldb.git3&#xff09;下载googletest和benchmark&#xff0c;cmake编译时需要 # 进入leveldb源码路径下的third_part…

干了2年的手工点点点,感觉每天浑浑噩噩,我的自动化测试之路...

作为一个测试人员&#xff0c;从业年期从事手工测试的工作是没有太多坏处的&#xff0c;当然&#xff0c;如果一直点来点去那么确实自身得不到提高&#xff0c;这时候选择学习自动化测试是一件很有必要的事情&#xff0c;一来将自己从繁重的重复工作中解放出来&#xff0c;从事…

操作系统——6.系统调用

目录 1.概述 2.系统调用的定义和作用 2.1 定义 2.2 功能 2.3 分类 3.系统调用和库函数的区别 4.系统调用背后的过程 5.小结 1.概述 这篇文章我们主要来介绍一下操作系统中的系统调用&#xff0c;下面来看一下具体的框架图&#xff1a; 2.系统调用的定义和作用 2.1 定…

Mysql索引学习

1. 索引 1.1 索引概述 MySQL官方对索引的定义为&#xff1a;索引&#xff08;index&#xff09;是帮助MySQL高效获取数据的数据结构&#xff08;有序&#xff09;。在数据之外&#xff0c;数据库系统还维护者满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引…