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

39 阅读1分钟

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

📖 考察点

链表

📖 题意理解

原地修改

💡 解题思路

搞清指针当前指向的值

🔑 关键点总结

💻 代码实现

JavaScript

var swapPairs = function(head) {
    let ret = new ListNode(0,head);
    let pre = ret;
    while(pre.next && pre.next.next){
        let temp = pre.next.next;
        pre.next.next = pre.next.next.next;
        temp.next = pre.next;
        pre.next = temp;
        pre = pre.next.next;
    }
    return ret.next;
};

Rust


⏱️ 复杂度分析

📚 总结与反思


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

📖 考察点

链表 快慢指针

📖 题意理解

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

💡 解题思路

🔑 关键点总结

💻 代码实现

JavaScript

var removeNthFromEnd = function(head, n) {
    if(!head.next){
        return null;
    }
    let quick = head;
    let slow = head;
    while(n--){
        quick = quick.next;
    }
    if(!quick){
        return head.next;
    }
    while(quick.next!==null){
        slow = slow.next;
        quick = quick.next;
    }
    slow.next= slow.next.next;
    return head;
};

⏱️ 复杂度分析

📚 总结与反思


⏱️ 复杂度分析

📚 总结与反思


LeetCode 面试题 02.07. 链表相交

📖 考察点

链表 操作

📖 题意理解

找出相交的节点

💡 解题思路

算出每个链表的长度, 统一到相同的位置 同时便历 相同的就是相交的节点

🔑 关键点总结

💻 代码实现

JavaScript

var getIntersectionNode = function(headA, headB) {
    let ptrA = headA;
    let ptrB = headB;
    let lenA = 0;
    let lenB = 0;
    while(ptrA){
        lenA++;
        ptrA = ptrA.next;
    }
    while(ptrB){
        lenB++;
        ptrB = ptrB.next;
    }
    let cA;
    let cB;
    if(!(lenA > lenB)){
        [cB,cA] = [headA,headB];
        [lenA,lenB] = [lenB,lenA]
    }else{
        [cA,cB] = [headA,headB];
    }
    let offset = lenA-lenB;
    console.log(offset);
    while(offset--){
        cA = cA.next;
    }
    while(lenB--){
        if(cA === cB){
            return cA;
        }
        cA = cA.next;
        cB = cB.next;
    }

    return null;
};

⏱️ 复杂度分析

📚 总结与反思


LeetCode 142. 环形链表 II

📖 考察点

链表 数学计算

📖 题意理解

找出环形链表的入口

💡 解题思路

数学计算

🔑 关键点总结

💻 代码实现

JavaScript

var detectCycle = function(head) {
    let fast = head;
    let slow = head;
    let temp;
    while(fast && fast.next){
        fast = fast.next.next;
        slow = slow.next;
        if(fast === slow){
            temp = fast;
            let slow2 = head;
            while(slow2!==slow){
                slow2=slow2.next;
                slow = slow.next;
            }
            return slow;
        }
    }
    return null;

};

⏱️ 复杂度分析

📚 总结与反思

有些问题需要用数学思维去解决