25.k个一组翻转链表
给你链表的头节点
head
,每k
个节点一组进行翻转,请你返回修改后的链表。
k
是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k
的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
思路:利用206.翻转链表的思想完成翻转操作
设置一个哨兵节点,使得每次k个一组都能和前一节点相连接
k个一组的链表头为start,尾为end
实现:
/**
* @param {ListNode} head
* @param {number} k
* @return {ListNode}
*/
var reverseKGroup = function (head, k) {
let dummy = new ListNode()
// 哨兵节点
dummy.next = head
let pre = dummy
while (true) {
let start = pre.next
let end = pre
// 循环找到end的位置
for (let count = k; count > 0&& end != null; count--) {
end = end.next
}
if (!end) break // 后面的长度不够 直接退出循环
// 存下end后一个节点 然后开始翻转
let next = end.next
reverseList(start, k)
// 将反转好的一节链表连上
pre.next = end
start.next = next
// 将pre移到下一组前一个节点
pre = start
}
return dummy.next
function reverseList(start, k) {
let pre = null
let cur = start
for (let count = k; count > 0; count--) {
let next = cur.next // 先存储下一个节点
cur.next = pre // 连接
// 移动位置
pre = cur
cur = next
}
}
};
15.三数之和
给你一个整数数组
nums
,判断是否存在三元组[nums[i], nums[j], nums[k]]
满足i != j
、i != k
且j != k
,同时还满足nums[i] + nums[j] + nums[k] == 0
。请你返回所有和为
0
且不重复的三元组。注意:答案中不可以包含重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4] 输出:[[-1,-1,2],[-1,0,1]] 解释: nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。 nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。 nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。 不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。 注意,输出的顺序和三元组的顺序并不重要。
思路: 先由小到大排序,从最左边开始固定一个数,计算这个数和右边区间左右指针相加之和,和小于0左指针右移,和大于0右指针左移
实现:
var threeSum = function (nums) {
// 从小到大排序
nums = nums.sort((a, b) => a - b)
let len = nums.length
if (nums && len < 3) return []
let result = []
// cur从0一直移动到len-1
for (let cur = 0; cur < len; cur++) {
// cur>0 那么它右边两个数相加一定大于0
if (nums[cur] > 0) break
// 跳过重复项
if(cur > 0 && nums[cur] == nums[cur-1]) continue
let l = cur + 1
let r = len - 1
// 固定cur 移动l和r
while (l < r) {
let sum = nums[cur] + nums[l] + nums[r]
if (sum == 0) {
result.push([nums[cur], nums[l], nums[r]])
// 去除重复项
while (l < r && nums[l] == nums[l + 1]) l++
while (l < r && nums[r] == nums[r - 1]) r--
l++
r--
} else if (sum < 0) {
l++
} else if (sum > 0) {
r--
}
}
}
return result
};
我k,三数之和真的是,写一次忘一次,忘一次写一次,写一次忘一次!QAQ