LeetCode 分类刷题:1669. 合并两个链表

题目

给你两个链表 list1list2 ,它们包含的元素分别为 n 个和 m 个。

请你将 list1 中下标从 ab 的全部节点都删除,并将list2 接在被删除节点的位置。

下图中蓝色边和节点展示了操作后的结果:

请你返回结果链表的头指针。

提示:

  • 3 <= list1.length <=
  • 1 <= a <= b < list1.length - 1
  • 1 <= list2.length <=

解析

我的思路:

// 第一次快指针从头走(b-a+2)步

// 第二次快指针继续走a-1步,慢指针从头走a-1步

// 修改快慢指针分别指向链表2的尾和头

官方题解思路:

// 第一次慢指针从头走a-1步

// 让快指针指向慢指针的位置,再走(b-a+2)步

// 慢指针的next指向list2(头节点)

// list2移动到链表2的尾节点

// 快指针的next指向list2(尾节点)

对比可以发现官方题解有几处巧思,比如:直接让快指针指向慢指针再走(b-a+2)步;确定快慢指针的位置后,先让慢指针的下个节点链接上链表2,再将链表2的头指针用于移动,寻找尾节点,避免了创建新的指针变量。

答案

我的答案:

javascript 复制代码
/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} list1
 * @param {number} a
 * @param {number} b
 * @param {ListNode} list2
 * @return {ListNode}
 */
var mergeInBetween = function(list1, a, b, list2) {
    // 第一次快指针走(b-a+2)步
    // 第二次快指针走a-1步,慢指针走a-1步
    // 修改快慢指针分别指向链表2的尾和头
    let slow = list1;
    let fast = list1;
    for(let i = 0; i < b - a + 2; i++) {
        fast = fast.next;
    }
    for(let i = 0; i < a - 1; i++) {
        fast = fast.next;
        slow = slow.next;
    }
    let tail2 = list2;
    while(tail2.next) {
        tail2 = tail2.next;
    }
    slow.next = list2;
    tail2.next = fast;
    return list1;
};

官方题解:

javascript 复制代码
var mergeInBetween = function(list1, a, b, list2) {
    let preA = list1;
    for (let i = 0; i < a - 1; i++) {
        preA = preA.next;
    }
    let preB = preA;
    for (let i = 0; i < b - a + 2; i++) {
        preB = preB.next;
    }
    preA.next = list2;
    while (list2.next) {
        list2 = list2.next;
    }
    list2.next = preB;
    return list1;
};

// 作者:力扣官方题解
// 链接:https://leetcode.cn/problems/merge-in-between-linked-lists/solutions/2079499/he-bing-liang-ge-lian-biao-by-leetcode-s-alt8/
// 来源:力扣(LeetCode)
// 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

复杂度分析

时间复杂度:O(n+m),其中 n 是 list1​ 的长度,m 是 list2​ 的长度。

空间复杂度:O(1)

我觉得时间复杂度是O(b + m),但是官方题解给的是O(n+m)?

  • O(b + m):强调操作与b的直接关系。
  • O(n + m):强调最坏情况下与链表1长度的关系。

更规范的表述是O(n + m),因为算法分析通常以输入规模的完整上限为准。

相关推荐
志尊宝4 分钟前
Vue3 零基础每日笔记(017):事件处理进阶——$event、多事件与事件修饰符全家桶
javascript·vue.js·笔记
光影少年24 分钟前
react navite浏览器 Event Loop 和 Node Event Loop 的区别
前端·javascript·react native·react.js·前端框架
bug总结13 小时前
uniapp vue3全局方法注册使用
前端·javascript·uni-app
Navigator_Z14 小时前
LeetCode //C - 1240. Tiling a Rectangle with the Fewest Squares
c语言·算法·leetcode
稻米哟14 小时前
力扣100——双指针
算法·leetcode
华无丽言14 小时前
如何在宜搭中实现获取子表中的字段值赋值到父表中?
前端·javascript·低代码
2601_9623824315 小时前
剑指大前端全栈工程师(全2册)主要情节
javascript·实战案例·全栈工程师·剑指大前端·html5+css3
泯泷15 小时前
手搓JSVM第 12 篇:完整最小 JSVM 实现与源码设计复盘
前端·javascript·前端框架
默_笙15 小时前
🍔 给 AI 发一张结构化表格(下):从"自由发挥"到"按格填空"的输出驯服指南
前端·javascript
泯泷15 小时前
手搓JSVM第 11 篇:打包、模块与 CLI:把 VM 产物变成可运行文件
前端·javascript·前端框架