2. 两数相加
19. 删除链表的倒数第 N 个结点
61. 旋转链表
102. 二叉树的层序遍历
广度优先搜索
用队列(切片)缓存下一层的数据并作为下一次遍历的数据
138. 复制带随机指针的链表
142. 环形链表 II
和简单版本不一样,要获取环的入口结点
关键是要理解该题的 数学思路:
- 根据数学思维和相应公式,快慢指针都要从头结点出发
- 使用头结点配合慢指针获取入口结点
189. 轮转数组
有三种解法,我想到的其中两种是 拼接数组 和 计算移动后位置放入新数组里
满足空间复杂度为 O(1) 的原地解法思路为:先把数组整体反转,再将数组分割后进行两次局部反转,注意要通过模除计算出分割点
300. 最长递增子序列
328. 奇偶链表
空间复杂度要求为 O(1),因此不能额外开辟堆空间,即创建额外的链表
430. 扁平化多级双向链表
707. 设计链表
单链表
双链表
912. 排序数组
快速排序:原理和思路见:
实现了三数取中优化法,代码稍作改动,去除了部分冗余判断:
func sortArray(nums []int) []int {quickSort(nums, 0, len(nums)-1)return nums}func quickSort(nums []int, left, right int) {if left < right {index := partition(nums, left, right)quickSort(nums, left, index-1)quickSort(nums, index+1, right)}}func partition(nums []int, left, right int) int {mid := left + (right - left) / 2if nums[left] > nums[right] {nums[left], nums[right] = nums[right], nums[left]}if nums[mid] > nums[right] {nums[mid], nums[right] = nums[right], nums[mid]}if nums[mid] > nums[left] {nums[mid], nums[left] = nums[left], nums[mid]}pivot := nums[left]start := leftfor {for left < right && nums[right] >= pivot {right--}for left < right && nums[left] <= pivot {left++}if left == right {break}nums[left], nums[right] = nums[right], nums[left]}nums[start], nums[left] = nums[left], nums[start]return left}
