首页 > 编程语言 >代码随想录算法训练营Day04: 24.两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交,142.环形链表||

代码随想录算法训练营Day04: 24.两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交,142.环形链表||

时间:2022-12-11 21:35:45浏览次数:77  
标签:head ListNode fastNode 随想录 next 链表 null 节点

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

tag: #链表 #反转
leetcode 地址:24. 两两交换链表中的节点

代码:

function swapPairs(head: ListNode | null): ListNode | null {
    const resHead = new ListNode()
    resHead.next = head
    let tem = resHead
    while(tem.next && tem.next.next) {
        const node1 = tem.next
        const node2 = tem.next.next
        node1.next = node2.next
        node2.next = node1
        tem.next = node2
        tem = node1
    }
    return resHead.next
};

思路解析:

  • 相比于92. 反转链表 II这个更加简单一些,因为只是两两相邻的交换,因此可以直接手动交换位置

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

tag: #链表 #双指针 #虚拟头节点
leetcode 地址:19. 删除链表的倒数第 N 个结点

代码:

function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null {
	if(head == null) return null
	
    let newHead = new ListNode()
    newHead.next = head
    let left = newHead, right = newHead

    while(n--) {
        right = right.next
    }
    while(right.next) {
        right = right.next
        left = left.next
    }
    left.next = left.next.next

    return newHead.next
};

面试题 02.07. 链表相交

tag: #链表 #双指针 #总长度相等
leetcode 地址:面试题 02.07. 链表相交

代码:

var getIntersectionNode = function(headA, headB) {
    let p1 = headA, p2 = headB
    while(p1 !== p2) {
	    // 注意这里要用 p1、p2 作为判断条件
	    // 如果用 p1.next 作为判断条件,那么当 headA、headB 不相交的时候
	    // p1、p2 不会同时等于 null,因此会造成死循环
        p1 = p1 ? p1.next : headB
        p2 = p2 ? p2.next : headA
    }

    return p1
};

142. 环形链表 II

tag: #链表 #环形 #数学 #双指针
leetcode 地址:142. 环形链表 II

代码:

function detectCycle(head: ListNode | null): ListNode | null {
    let slowNode: ListNode | null = head,
        fastNode: ListNode | null = head;
    while (fastNode !== null && fastNode.next !== null) {
        slowNode = slowNode!.next;
        fastNode = fastNode.next.next;
        if (slowNode === fastNode) {
            slowNode = head;
            while (slowNode !== fastNode) {
                slowNode = slowNode!.next;
                fastNode = fastNode!.next;
            }
            return slowNode;
        }
    }
    return null;
};

思路解析:
分为 x,y,z 的距离
因为fast指针是一步走两个节点,slow指针一步走一个节点, 所以 fast指针走过的节点数 = slow指针走过的节点数 * 2:

(x + y) * 2 = x + y + n (y + z)

即:x + y = n (y + z)x = n (y + z) - y
当 n = 1, x = z
当 n = 2, x = y + z + z

因此当 fast 和 slow 两个指针相遇的时候,我们从 head 新移动一个指针和 slow 一起移动,相遇点既是入口

相似题目:

标签:head,ListNode,fastNode,随想录,next,链表,null,节点
From: https://www.cnblogs.com/mlkk/p/16974527.html

相关文章

  • 代码随想录算法训练营Day18|513. 找树左下角的值、112. 路径总和、106. 从中序与后序
    代码随想录算法训练营Day18|513.找树左下角的值、112.路径总和、106.从中序与后序遍历序列构造二叉树513.找树左下角的值513.找树左下角的值假设二叉树中至少有一......
  • 不带头结点单链表题
    1.编写函数linklistdex(linklisthead,datatypex),删除不带头结点单链表head中的第一个值为x的结点。思路:对链表head进行循环遍历,若找到含有x的结点,直接删除。linklis......
  • 脚本之一键安装单节点elasticsearch
    #!/bin/bashES_VERSION=7.17.5#ES_VERSION=7.9.3#ES_VERSION=7.6.2UBUNTU_URL="https://mirrors.tuna.tsinghua.edu.cn/elasticstack/7.x/apt/pool/main/e/elasticsearch/el......
  • 模板链表类的扩展(QListEx<T>)
    以前写的链表都是比较简单的,插入节点是在头节点上,所以循环链表时都是从最后一个数据往前找的,给人的感觉是倒着的,今天写一个在链表尾部插入数据1。链表节点类的定义/链......
  • javascript-代码随想录训练营day25
    216.组合总和Ⅲ题目链接:https://leetcode.cn/problems/combination-sum-iii/题目描述:找出所有相加之和为n的k个数的组合,且满足下列条件:只使用数字1到9每个数字......
  • 代码随想录训练营第六十天 | 单调栈
    今天是代码随想录训练营的第六十天,是最后一天,也代表这一刷结束 84.柱状图中最大的矩形classSolution{publicintlargestRectangleArea(int[]heights){......
  • #yyds干货盘点# LeetCode程序员面试金典:链表求和
    题目:给定两个用链表表示的整数,每个节点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。 示例:输入:(7->1->......
  • 二叉树的下一个节点
    给定一棵二叉树的其中一个节点,请找出中序遍历序列的下一个节点。/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*l......
  • 代码随想录训练营第五十八章|单调栈
    今天是训练营第五十八天,是最后一天单调栈的开始  739.每日温度 classSolution{publicint[]dailyTemperatures(int[]temperatures){intn......
  • 代码随想录训练营第五十九天| 单调栈
     今天是第五十九天,有经典的接雨水问题 ●  503.下一个更大元素II classSolution{publicint[]nextGreaterElements(int[]nums){if(nums==......