LeetCode Hot100刷题指南(第3期)

LeetCode Hot100刷题指南(第3期)

大家好 我是寸铁

临近秋招,让我们一起刷题吧

每期5道题 持续更新中

欢迎点赞 + 关注

往期回顾

蓝桥杯上岸全指南

往期回顾

蓝桥杯上岸必背!!!(第一期)

蓝桥杯必背! ! ! (第二期)

考点秘籍

蓝桥杯省一你一定不能错过的模板大全(第一期)

蓝桥杯省一你一定不能错过的模板大全(第二期)

蓝桥杯每日一题 最少刷题数

蓝桥杯每日一题 求阶乘

蓝桥杯 Java 省赛 B 组(初赛)填空题

Java快读快写

暑假完善蓝桥杯和Leetcode系列,欢迎各位同学前来交流

第三期

141. 环形链表

类似题目

类似:234. 回文链表

解题思路

快慢指针,如果链表存在有环,快指针fast 一定会追上慢指针slow
因为当 fast 从后面接近slow时, 有两种可能性:

  1. fast 比 slow 慢一步
  2. fast 比 slow 慢两步
  3. 快指针与慢指针之间差n

所以:

  1. fast 比 slow 慢一步: fast 走了两步, slow 走了一步, fast 与 slow 相遇
  2. fast 比 slow 慢两步: fast 走了两步, slow 走了一步, fast 与 slow 相差1步, 回到第一种情况
  3. 此时继续往后走,slow前进一步,fast前进两步,两者之间相差n+1-2n-1步。重复这个过程,直到快指针和慢指针相遇。

所以, 如果链表有环, 快指针一定会追上慢指针, 二者相遇。
通常设定快指针比慢指针多走一步,减少访问链表的频率。

注意

slow 和 fast 最初设定不能都等于head
这道题不同于234. 回文链表
234. 回文链表是去找到链表的中点
这道题是去看有无环,用快慢指针做,最终两指针相遇。
while循环的终止条件为slow != fast
如果一开始slow = head; fast = head;
则循环不进行,与目的不符合。

证明推导

时间复杂度

最多遍历一遍链表的n个节点
总计为O(n)

代码

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
   
    public boolean hasCycle(ListNode head) {
   
        //当无节点或者只有一个节点
        if(head == null || head.next == null){
   
        return false;
        }
        
        //定义起点位置,相当于同一起跑线,不影响后面的步数之差
        //2个节点以上,包含环,用快慢指针
        ListNode slow = head;
        ListNode fast = head.next;
        //还没有相遇时
        while(slow != fast){
   
            //快指针跑得比慢指针快,先让他去判断
            if(fast == null || fast.next == null){
   
                return false;
            }
            slow = slow.next;//走一步
            fast = fast.next.next;//走两步
        }
        return true;
    }

}

21. 合并两个有序链表

LeetCode Hot100刷题指南(第3期)_第1张图片

解题思路

先判断为链表的情况(递归的基值)

  1. l1为空链表则返回l2
  2. l2为空链表则返回l1
    再进行合并
    合并根据两链表节点值的大小进行合并
  3. l1的值 < l2的值 则l1的下一个节点指向l2
  4. l1的值 >= l2的值 则l2的下一个节点指向l1
    每次更新后,将当前的链表进行返回,用于下一次递归合并两链表

代码

 
 

你可能感兴趣的:(LeetCode,Hot100,leetcode,算法,职场和发展,java,经验分享,蓝桥杯,笔记)