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

91 阅读1分钟

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

题号:1721
//2次遍历找到要交换的节点
var swapNodes = function (head, k) {

    //total记录链表节点总个数
    let node1 = null, node2 = null, total = 0, curNode = head
    while (curNode) {
        total++
        if (total == k) {
            //记录第k个节点
            node1 = curNode
        }
        curNode = curNode.next
    }
    //二次遍历找倒数k个节点
    curNode = head
    num = total - k + 1
    while (curNode) {
        num--
        if (num == 0) {
            break
        }
        curNode = curNode.next

    }
    node2 = curNode
    if (node1 != node2) {
        //开始交换
        let tmp = node1.val
        node1.val = node2.val
        node2.val = tmp
    }
    return head
};

//快慢指针
var swapNodes = function (head, k) {
    if (head == null) {
        return head
    }
    let slow = head, fast = head, num = k - 1
    let node1 = head, node2 = head
    while (fast.next) {
        fast = fast.next
        num--
        if (num == 0) {
            node1 = fast
        } else if (num < 0) {
            slow = slow.next
        }
    }
    node2 = slow
    //开始交换
    let tmp = node1.val
    node1.val = node2.val
    node2.val = tmp
    return head
};
题号:面试题 02.05. 链表求和
var addTwoNumbers = function (l1, l2) {
    //保存进位
    let next = 0, dummy = new ListNode(-1), curNode = dummy
    while (l1 && l2) {

        let sum = l1.val + l2.val + next
        next = Math.floor(sum / 10)

        let newNode = new ListNode(sum % 10)
        curNode.next = newNode

        curNode = curNode.next
        l1 = l1.next
        l2 = l2.next
    }

    while (l2) {
        let sum = l2.val + next
        next = Math.floor(sum / 10)
        let newNode = new ListNode(sum % 10)
        curNode.next = newNode

        curNode = curNode.next
        l2 = l2.next
    }

    while (l1) {
        let sum = l1.val + next
        next = Math.floor(sum / 10)
        let newNode = new ListNode(sum % 10)
        curNode.next = newNode

        curNode = curNode.next
        l1 = l1.next
    }

    if (next > 0) {
        let newNode = new ListNode(next)
        curNode.next = newNode
    }
    return dummy.next
};
题号:143
var reorderList = function (head) {

    let arr = []
    while (head) {
        arr.push(head)
        head = head.next
    }
    let left = 0, right = arr.length - 1
    while (left < right) {
        let leftNode = arr[left]
        let rightNode = arr[right]
        leftNode.next = rightNode
        left++
        //left和right是相邻节点直接返回
        if (left == right) {
            break
        }
        rightNode.next = arr[left]
        right--
    }
    arr[left].next = null
};