首页 > 其他分享 >代码随想录Day4-Leetcode24-两两交换链表中的节点, 19.删除链表的倒数第N个节点, 142.环形链表II

代码随想录Day4-Leetcode24-两两交换链表中的节点, 19.删除链表的倒数第N个节点, 142.环形链表II

时间:2023-03-19 10:44:49浏览次数:57  
标签:head ListNode val 随想录 next 链表 let 节点

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

题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs
比较简单的链表题, 注意使用虚拟头结点和注意变量就没问题


/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var swapPairs = function(head) {
    if(head == null||head.next == null){
        return head
    }
    let vHead = new ListNode(-1,head)
    let pre = vHead , p1 = head, p2 = head.next
    while(true){
        let tmp = p2.next
        p2.next = p1
        p1.next = tmp
        pre.next = p2
        tmp = p1
        p1 = p2
        p2 = tmp
        for(let i = 0 ;i<2;i++){
            if(p2.next!=null){
                p2 =p2.next
                p1 = p1.next
                pre = pre.next
            }else{
                return vHead.next
            }
        }

    }
};

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

题目链接:https://leetcode.cn/problems/remove-nth-node-from-end-of-list
这题写过,所以还挺快的,双指针秒A(终于有一天我也能有秒A的题了,虽然是简单题,还是做过的)

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} n
 * @return {ListNode}
 */
var removeNthFromEnd = function(head, n) {

    let vHead = new ListNode(-1,head)
    let slow = vHead, fast = vHead
    for(let i =0; i<n;i++){
        fast = fast.next
    }
    while(fast.next!=null){
        fast = fast.next
        slow = slow.next
    }
    slow.next = slow.next.next
    return vHead.next
};

面试题 02.07. 链表相交

这题偷懒用set了,好方便
知道可以用快慢指针, 但数学推导有点麻烦

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */

/**
 * @param {ListNode} headA
 * @param {ListNode} headB
 * @return {ListNode}
 */
 //同样可以快慢指针, 但需要数学推导
 //如果可用map或set
var getIntersectionNode = function(headA, headB) {
    let set = new Set()
    
    let pa = headA
    let pb = headB
    while(pa!=null){
        set.add(pa)
        pa = pa.next
    }
    while(pb!=null){
        if(set.has(pb)){
            return pb
        }
        pb = pb.next
    }
    return null

};

142.环形链表II

这题看了题解, 确实不太好想出来
需要一点数学上的灵感, 或者稳稳的慢慢推导

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
 //思路:快慢指针,最后会相遇,但我忘记算法了
 //map?
var detectCycle = function(head) {
    if(head == null||head.next == null){
        return null
    }
    let fast = head, slow = head
    while(true){
        for(let i = 0; i<2; i++){
            if(fast.next!=null){
                fast = fast.next
            }else{
                return null
            }
        }
        slow = slow.next
        if(slow === fast){
            //相遇//很多时候不能看语句的数量来评价算法复杂度, 就这句能写出来,不简单
            fast = head
            while(slow!==fast){
                fast = fast.next
                slow = slow.next
            }
            return slow
        }
        //a b
        //s 2s = s+nb
        //s= nb
        //到交叉点的路程a+nb
    }
};

标签:head,ListNode,val,随想录,next,链表,let,节点
From: https://www.cnblogs.com/herbert118/p/17232580.html

相关文章

  • 代码随想录训练营day 15||二叉树的层序遍历、翻转二叉树、对称二叉树
    二叉树的层序遍历题目链接:二叉树的层序遍历题目描述:给你一个二叉树,请你返回其按层序遍历得到的节点值。(即逐层地,从左到右访问所有节点```输入:root=[3,9,20,nu......
  • 代码随想录18 513.找树左下角的值 | 112. 路径总和 113.路径总和ii | 106.从中序
    513. 找树左下角的值给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。假设二叉树中至少有一个节点。示例1:输入:root=[2,1,3]输出......
  • 力扣---剑指 Offer 24. 反转链表
    定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入:1->2->3->4->5->NULL输出:5->4->3->2->1->NULL限制:0<=节点个数<=5000来源:力扣(Lee......
  • 力扣---剑指 Offer 06. 从尾到头打印链表
    输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例1:输入:head=[1,3,2]输出:[2,3,1]限制:0<=链表长度<=10000来源:力扣(LeetCode)链接:https://leetcode......
  • day4 | 19. 删除链表的倒数第N个结点,24. 两两交换链表中的节点,
    19.删除链表的倒数第N个结点 题目描述 删除链表的倒数第n个结点,并且返回链表的头节点 思路 1.先确定链表结点数,得到length2.再遍历到第length-n个结点上,改......
  • 代码随想录算法训练营Day46 动态规划
    代码随想录算法训练营代码随想录算法训练营Day46动态规划|● 139.单词拆分关于多重背包,你该了解这些!背包问题总结篇!139.单词拆分题目链接:139.单词拆分给定一......
  • 数据结构-->链表_02
    本期的链表继续进行,上期我们完成了链表的增加和删除。现在接下来,我们进行链表的查改与优化头文件“SList.h”#include<stdio.h>#include<assert.h>#include<stdlib.h>typ......
  • 19. 删除链表的倒数第 N 个结点
    19.删除链表的倒数第N个结点给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。示例1:输入:head=[1,2,3,4,5],n=2输出:[1,2,3,5]示例2:输入:head=......
  • 24.两两交换链表中的结点
    24.两两交换链表中的节点给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例1:输入......
  • 142.环形链表plus
    142.环形链表II给定一个链表的头节点head,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链......