当前位置: 首页 > news >正文

LeetCode 解题思路 15(Hot 100)

在这里插入图片描述

解题思路:

  1. 引入哑节点: 简化头节点删除操作,统一处理所有边界条件。
  2. 快慢指针法: 快指针先移动 n 步,确保快慢指针距离为 n,之后同步移动快慢指针。当快指针到达末尾时,慢指针指向倒数第 n 个节点的前驱。
  3. 删除节点: 调整慢指针的 next 指针,跳过目标节点。

Java代码:

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummy = new ListNode(-1);
        dummy.next = head;

        ListNode fast = dummy, slow = dummy;

        for (int i = 0; i < n; i++) 
            fast = fast.next;
        
        while (fast.next != null) {
            slow = slow.next;
            fast = fast.next;
        }

        slow.next = slow.next.next;

        return dummy.next;
    }
}

复杂度分析:

  • 时间复杂度: O(m),其中m是链表的长度。
  • 空间复杂度: O(1),只使用了常数级别的额外空间。

在这里插入图片描述

解题思路:

  1. 创建哑节点: 作为新链表的头前驱,统一处理头节点交换。
  2. 初始化指针: prevEnd:标记当前交换对的末尾,初始指向哑节点。first 和 second:指向待交换的两个节点。
  3. 交换节点: 保存 second 的下一个节点 nextNode。调整指针顺序:prevEnd → second → first → nextNode。
  4. 移动指针: prevEnd 移动到当前交换后的第一个节点(原 first),继续处理下一对。
  5. 终止条件: 当剩余节点不足两个时停止循环。

Java代码:

class Solution {
    public ListNode swapPairs(ListNode head) {
        if (head == null || head.next == null) return head;

        ListNode dummy = new ListNode(-1);
        dummy.next = head;

        ListNode prevEnd = dummy;
        ListNode first = prevEnd.next;
        ListNode second = first.next;

        while (first != null && second != null) {
            ListNode nextNode = second.next;
            
            prevEnd.next = second;
            second.next = first;
            first.next = nextNode;

            prevEnd = first;
            first = prevEnd.next;
            if (first == null) break;
            second = first.next;
            if (second == null) break;
        }

        return dummy.next;
    }
}

复杂度分析:

  • 时间复杂度: O(n),遍历链表一次,每个节点操作为常数时间。
  • 空间复杂度: O(1),仅使用哑节点和指针变量,常数空间。

相关文章:

  • IDEA 一键完成:打包 + 推送 + 部署docker镜像
  • 面试题之webpack file-loader和url-loader
  • 前端面试:cookie 可以实现不同域共享吗?
  • 2025年渗透测试面试题总结-阿里巴巴-阿里云安全 一面、三面(题目+回答)
  • 低光图像增强新突破!HVI 色彩空间 + CIDNet 网络如何攻克红黑噪声难题?
  • 【Linux】进程间通信:匿名管道与进程池
  • 全面解析与实用指南:如何有效解决ffmpeg.dll丢失问题并恢复软件正常运行
  • java数据处理:Map<String, Object>、Map<String, List<Room>>、Map<String, Integer>
  • VBA+FreePic2Pdf 找出没有放入PDF组合的单个PDF工艺文件
  • 【vue3学习笔记】(第150-151节)computed计算属性;watch监视ref定义的数据
  • LeetCode 力扣热题100 单词拆分
  • RocketMQ性能优化篇
  • 深度学习 bert流程
  • Spring Boot3.3.X整合Mybatis-Plus
  • 【Azure 架构师学习笔记】- Azure Databricks (18) --Delta Live Table 架构
  • Discuz建站教程之论坛头部logo跳转链接怎么修改?
  • Python多版本环境管理UV
  • Maven的继承和聚合
  • 55.HarmonyOS NEXT 登录模块开发教程(九):部署与发布
  • Qt信号与槽
  • 中国田径巡回赛西安站完赛:男子跳远石雨豪夺冠,女子跳高刘肼毅折桂
  • 私家车跑“顺风”出事故,意外险赔不赔?
  • 美联储官员:美国经济增速可能放缓,现行关税政策仍将导致物价上涨
  • 广西:坚决拥护党中央对蓝天立进行审查调查的决定
  • 中国情怀:时代记录与家国镜相|澎湃·镜相第三届非虚构写作大赛征稿启事
  • 龚正市长调研闵行区,更加奋发有为地稳增长促转型,久久为功增强发展后劲