日常刷题0x5之德玛蹲草丛

116 阅读1分钟

此阶段给自己定的目标是:做过的这些题每天坚持继续刷二遍,每道题做过之后开始尝试多解法尝试解题。上一阶段是感知都有什么题目,此阶段主要系统化常规题解套路知识,牢记牢记此阶段目的。

题号:剑指 Offer 24
//递归
var reverseList = function (head) {
    
    //很多时候设置一个哑节点有利于简化处理逻辑
    let dummy = null
    let helper = (node) => {
        if (node == null) {
            dummy = new ListNode(-1)
            return dummy
        }
        let preNode = helper(node.next)
        preNode.next = node
        node.next = null
        return node
    }
    helper(head)

    return dummy.next
};
题号:剑指 Offer 18
var deleteNode = function (head, val) {
    let dummy = new ListNode(-1)
    dummy.next = head
    let preNode = dummy, curNode = head
    while (curNode) {
        if (curNode.val == val) {
            //开始删除
            preNode.next = curNode.next
            break
        } else {
            preNode = preNode.next
            curNode = curNode.next
        }
    }
    return dummy.next
};
题号:剑指 Offer 06
//递归
var reversePrint = function (head) {
    let result = []
    let helper = (node) => {
        if (node == null) {
            return
        }
        helper(node.next)
        result.push(node.val)
    }
    helper(head)
    return result
};

//栈迭代
var reversePrint = function (head) {
    let stack = []
    while (head) {
        stack.unshift(head.val)
        head = head.next
    }
    return stack
};
题号:剑指 Offer 52
//借助map,set之类的集合容器
var getIntersectionNode = function (headA, headB) {

    let set = new Set()
    while (headA) {
        set.add(headA)
        headA = headA.next
    }
    while (headB) {
        if (set.has(headB)) {
            return headB
        }
        headB = headB.next
    }
    return null
};

//一开始没想到此种解法
//数学知识了
var getIntersectionNode = function (headA, headB) {
    let l1 = headA, l2 = headB
    while (l1 != l2) {
        if (l1 == null) {
            l1 = headB
        } else {
            l1 = l1.next
        }
        if (l2 == null) {
            l2 = headA
        } else {
            l2 = l2.next
        }
    }
    return l1
};
题号:剑指 Offer 35
var copyRandomList = function (head) {

    let map = new Map(), curNode = head
    //遍历原始列表创建对应的副本节点并一一对应
    while (curNode) {
        let newNode = new Node(curNode.val, null, null)
        map.set(curNode, newNode)
        curNode = curNode.next
    }
    //开始组装结果链表
    //把上一步创建的副本串起来
    let dummy = new Node(-1, null, null)
    curNode = dummy
    while (head) {
        curNode.next = map.get(head)
        curNode.next.random = map.get(head.random)
        curNode = curNode.next
        head = head.next
    }
    return dummy.next
};