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