代码随想录算法营Day04:链表 (二)

代码随想录算法训练营第四天 | LeetCode 24. 两两交换链表中的节点, 19. 删除链表的倒数第N个节点, 160. 链表相交, 142. 环形链表II

LeetCode 24. 两两交换链表中的节点

let swapPairs = function (head) {
    let dummy = new ListNode(0, head), cur = dummy;
    // 保证了只有连续两个节点都存在时才进行交换
    while (cur.next && cur.next.next){
        // 定义临时变量保存下一个交换对的起始节点(不然赋值完就丢了)
        let temp = cur.next.next.next
        cur.next.next.next = cur.next
        cur.next = cur.next.next
        cur.next.next.next = temp
        cur = cur.next.next // // 移动指针到下一个交换对的起始节点
    }
}

要注意赋值的顺序,和哪个值/节点需要被临时储存

LeetCode 19. 删除链表的倒数第N个节点

let removeNthFromEnd = function (head, n) {
    let dummy = new ListNode(0, head)
    let slow = dummy
    let fast = dummy
    for (let i = 0; i < n+1; i++){
        fast = fast.next // fast在slow右侧n+1距离的位置
    }
    // 如果fast已经指向null了,要删除的节点就是第一个节点,运用虚拟头节点删
    if (fast === null) {
        dummy.next = dummy.next.next
        return dummy.next
    }
    while (fast !== null) {
        fast = fast.next
        slow = slow.next
    }
    slow.next = slow.next.next // 删除slow所指向的节点
    return dummy.next // 返回整个链表
}

LeetCode 160. 链表相交

let getIntersectionNode = function (headA, headB) {
    let visited = new Set()
    let cur = headA
    while (cur){
        visited.add(cur)
        cur = cur.next
    }
    cur = headB
    while(cur){
        if (visited.has(cur)){
            return cur
        } else{
            cur = cur.next
        }

    }
    return null
}

首先,代码定义了一个 Set 集合 visited,用于存储遍历过的节点。

然后,从链表 headA 开始,遍历链表中的每个节点,将其添加到 visited 集合中。

接下来,从链表 headB 开始遍历,对于每个节点,检查它是否在 visited 集合中出现过。如果出现过,说明当前节点是两个链表的交点,直接返回该节点即可。

如果整个链表都遍历完了还没有找到交点,则返回 null。

LeetCode 142. 环形链表II

let detectCycle = function (head) {
    let visited = new Set()
    let cur = head
    while (cur) {
        if (visited.has(cur)) {
            return cur
        } else {
            visited.add(cur)
            cur = cur.next
        }
    }
    return null
}

和上一题很类似

反思:为什么不用List

list的底层实现是顺序表,查找的算法是顺序遍历查找,因此复杂度为O(n)
set的底层实现是哈希表(散列表),查找算法是利用红黑树进行查找,因此时间复杂度为O(logn)
没有索引的需求就用set

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值