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 小时前
LeetCode 移动零元素 快慢指针
算法·leetcode·职场和发展
Hi_kenyon4 小时前
VUE3套用组件库快速开发(以Element Plus为例)二
开发语言·前端·javascript·vue.js
漫随流水5 小时前
leetcode算法(515.在每个树行中找最大值)
数据结构·算法·leetcode·二叉树
EndingCoder6 小时前
Any、Unknown 和 Void:特殊类型的用法
前端·javascript·typescript
JosieBook6 小时前
【Vue】09 Vue技术——JavaScript 数据代理的实现与应用
前端·javascript·vue.js
千金裘换酒7 小时前
LeetCode反转链表
算法·leetcode·链表
华仔啊8 小时前
JavaScript 如何准确判断数据类型?5 种方法深度对比
前端·javascript
程序员小寒9 小时前
从一道前端面试题,谈 JS 对象存储特点和运算符执行顺序
开发语言·前端·javascript·面试
圣保罗的大教堂9 小时前
leetcode 1161. 最大层内元素和 中等
leetcode
闲看云起9 小时前
LeetCode-day6:接雨水
算法·leetcode·职场和发展