【刷题day07】LeetCode(力扣)每日一刷。[876. 链表的中间结点][142. 环形链表 II][121. 买卖股票的最佳时机]

简介: 学习[876. 链表的中间结点][142. 环形链表 II][121. 买卖股票的最佳时机]。

刷题打卡,第七天


题目一、876. 链表的中间结点

题目二、142. 环形链表 II

题目三、121. 买卖股票的最佳时机


题目一、876. 链表的中间结点


原题链接:876. 链表的中间结点


题目描述:


给定一个头结点为 head 的非空单链表,返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

微信图片_20221029150250.png

解题思路:

已经给定非空链表的头节点,那么就不需要判断链表是否为空了;

我们通过循环记录链表节点的个数,将记录的个数除以2得到指针需要移动的次数,返回移动完后的节点即可。


解题代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode middleNode(ListNode head) {
        ListNode curr = head;//创建新节点记录给定头节点
        int total = 0;       //total记录节点总数
        while(curr != null){ //不为空
            total++;         //记录节点数+1
            curr = curr.next;//指针指向下一节点
        }
        for(int i = 0;i < total>>1;++i){//total>>1,相当于总数 / 2
            head = head.next;           //指针扫过一半节点,抵达中间节点 
        }
        return head;//返回中间节点
    }
}

提交结果:

微信图片_20221029150258.png

题目二、142. 环形链表 II


原题链接:142. 环形链表 II


题目描述:


给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。


如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。

为了表示给定链表中的环,评测系统内部使用整数 pos来表示链表尾连接到链表中的位置(索引从 0 开始)。

如果 pos 是 -1,则在该链表中没有环。

注意:pos不作为参数进行传递,仅仅是为了标识链表的实际情况。


不允许修改 链表。

微信图片_20221029150306.png

输入:head = [3,2,0,-4], pos = 1

输出:返回索引为 1 的链表节点

解释:链表中有一个环,其尾部连接到第二个节点。

微信图片_20221029150313.png

输入:head = [1,2], pos = 0

输出:返回索引为 0 的链表节点

解释:链表中有一个环,其尾部连接到第一个节点。

微信图片_20221029150320.png

输入:head = [1], pos = -1

输出:返回 null

解释:链表中没有环。


解题思路:

使用不可重复的set集合来存放节点元素,不断扫描数组,若遇到无法存放节点的情况,说明节点重复,重复节点就是入环的第一个节点。

如果存在节点的下一节点为null,说明无环,直接返回null。

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode pos = head;
        Set set = new HashSet();//创建不可重复的单列集合
        while(pos != null){     //节点不为空时
            if(set.add(pos)){   //节点元素放入集合中
                pos = pos.next; //指针后移
            }else{              //节点无法放入集合,说明已经扫描过
                return pos;     //直接返回,这就是入环节点
            }
        }
        return null;            //存在节点下一位为空,说明无环,返回空
    }
}

提交结果:

微信图片_20221029150327.png


题目三、121. 买卖股票的最佳时机


原题链接:121. 买卖股票的最佳时机


题目描述:


给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。


你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。


返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

微信图片_20221029150338.png


解题思路:


遍历数组中每一天的股价,记录最低值min,遍历到比min大的股价,就计算差值,最终返回最大的差值,就代表最大利润。


解题代码:

class Solution {
    public int maxProfit(int[] prices) {
        int min = prices[0];//表示最低的价格
        int max = 0;        //表示最高的利润
        for(int i = 0;i < prices.length;++i){
            if(prices[i] <= min){//如果这天股价更低
                min = prices[i]; //将股价记录为min
            }else if(max < prices[i]-min){//如果这天股价高,计算与min差值
                max = prices[i]-min;      //若结果高于记录max,更新最大利润
            }
        }
        return max;               //返回最大利润
    }
}

微信图片_20221029150349.png

贵在坚持:

微信图片_20221029111446.jpg



目录
相关文章
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
403 6
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
390 3
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
443 1
LeetCode第19题删除链表的倒数第 N 个结点
该文章介绍了 LeetCode 第 19 题删除链表的倒数第 N 个结点的解法,通过使用快慢双指针,先将快指针移动 n 步,然后快慢指针一起遍历,直到快指针到达链尾,从而找到倒数第 N 个结点的前一个结点进行删除,同时总结了快慢指针可减少链表遍历次数的特点。
LeetCode第19题删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
233 0
|
Python
【Leetcode刷题Python】50. Pow(x, n)
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
390 1
|
算法
leetcode188 买卖股票的最佳时机IV
leetcode188 买卖股票的最佳时机IV
193 0
|
Python
【Leetcode刷题Python】1467. 两个盒子中球的颜色数相同的概率
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
281 0
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
218 6
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
280 4