线性表[数组] #
Top K问题 : 数组中最小的 k 个数 #
方法一: 堆, 时间复杂度 O(n log k) 方法二: 快排变形, (平均)时间复杂度 O(n)
LeetCode 88 #
-
题目
合并有序数组 [简单] -
Solution
LeetCode 88- 方法一:直接合并后排序
- 方法二:双指针
- 方法三:逆向双指针
Leetcode 283. #
- 题目
移动零
LeetCode 540 #
-
题目
数组的两分搜索 -
Solution
LeetCode 540. Single Element in a Sorted Array [中等]
线性表[链表] #
Leetcode 2 #
-
题目
两数相加 : 合并两个链表中的数,并返回一个新的链表 -
Solution
Leetcode 2.两数相加
Leetcode 2.两数相加
LeetCode21 #
-
题目
合并两个有序链表 [简单] -
Solution
public class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode dummyHead = new ListNode(0);
ListNode lastNode = dummyHead;
while (l1 != null && l2 != null) {
if (l1.val < l2.val) {
lastNode.next = l1;
l1 = l1.next;
} else {
lastNode.next = l2;
l2 = l2.next;
}
lastNode = lastNode.next;
}
lastNode.next = l1 != null ? l1 : l2;
return dummyHead.next;
}
}
LeetCode206 #
-
题目
单链表的反转 [简单] -
Solution
- 使用3个指针遍历单链表,逐个链接点进行反转。 复杂
- 从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾。 容易理解
public static Node reverseList(Node node) {
Node pre = null;
Node next = null;
while (node != null) {
next = node.next;
node.next = pre;
pre = node;
node = next;
}
return pre;
}
剑指 题16 理解单链表的反转(java实现) LeetCode206:反转链表
快指针,慢指针 #
-
链表中环的检测
- 硬解
- 每走一步,把节点的地址存在set中,走下一步的时候查找地址是否已经在set中
- 快指针是慢指针的两倍, 最后快指针和慢指针相遇
-
链表倒数第k个结点
剑指 题15 题解: 快指针先于慢指针走若干步
-
删除链表倒数第n个结点 [中等] LeetCode 19
-
求链表的中间结点 -> 快指针是慢指针的两倍 LeetCode 例题精讲 | 05 双指针×链表问题:快慢指针
在O(1)时间删除链表结点 #
剑指Offer
- 最常规的做法是从链表的头结点开始,顺序遍历查找要删除的结点,并在链表中删除该结点。 这种思路由于需要顺序查找,时间复杂度自然就是O(n)。
- 然而,可以把下一个结点的内容复制到需要删除的结点上覆盖原有的内容,再把下一个结点删除, 就相当于把当前需要删除的结点删除了,这样的时间复杂度是O(1)。
线性表[栈,队列] #
Leetcode 20 #
- 题目
有效的括号[简单] - Solution 题解:辅助栈
Leetcode 155 #
-
题目
包含min函数的栈 [简单] -
Solution
- 剑指 21题 , 指南 P1
- 题解:方法一:辅助栈
Leetcode 225 #
-
题目
用队列实现栈 -
Solution Leetcode 225. 用队列实现栈
Leetcode 232 #
-
题目
两个栈实现一个队列 [简单] -
Solution
剑指 7题,指南 P5
用数组来实现栈 #
参考 #
- 《剑指 offer》
- 《程序员代码面试指南》
算法面试通关40讲 覃超