以方法、数据结构分类
7.整数反转
1 | int reverse(int x){ |
9.回文数
1 | bool isPalindrome(int x){ |
13.罗马数字转整数
1 | int romanToInt(char * s){ |
双指针
14.最长公共前缀
1 | char * longestCommonPrefix(char ** strs, int strsSize){ |
26.删除有序数组中的重复项
1 | int removeDuplicates(int* nums, int numsSize) { |
80.删除有序数组中的重复项Ⅱ
1 | int removeDuplicates(int* nums, int numsSize) { |
88.合并两个有序数组
1 | // 题目关键要求:合并后的数组应保存在nums1中 |
151.翻转字符串里的单词
1 | char* reverseWords(char* s){ |
167.两数之和Ⅱ - 输入有序数组
1 | int* twoSum(int* numbers, int numbersSize, int target, int* returnSize) { |
283.移动零
1 | void moveZeroes(int* nums, int numsSize) { |
287.寻找重复数
1 | int findDuplicate(int* nums, int numsSize) { |
动态规划
509.斐波那契数
1 | int fib(int n) { |
53.最大子序和
1 | int maxSubArray(int* nums, int numsSize){ |
322.零钱兑换
1 | int coinChange(int* coins, int coinsSize, int amount){ |
链表
1 | /** |
21.合并两个有序链表
1 | struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) { |
61.旋转链表
1 | struct ListNode* rotateRight(struct ListNode* head, int k){ |
83.删除排序链表中重复元素
1 | struct ListNode* deleteDuplicates(struct ListNode* head) { |
86.分隔链表
1 | struct ListNode* partition(struct ListNode* head, int x) { |
141.环形链表
1 | bool hasCycle(struct ListNode *head) { |
经典方法:快慢指针
slow每次走一,fast每次走二
应用:判断链表是否存在环、找到环的入口点,找出未知长度单链表的中间节点等
160.相交链表
1 | struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) { |
本题关键在于两链表的长度可以不同。如果两链表长度相同,那么只需两指针同步前进即可轻松解决。当长度不同时,可以先通过遍历得到长度,再提前将较长的链表指针前移两者的长度差位,便可开始同步移动。而所示方法算法更加简洁,将两链表”串联成环“考虑,最终两指针会在交点处相遇。
203.移除链表元素
1 | struct ListNode* removeElements(struct ListNode* head, int val) { |
206.反转链表
1 | struct ListNode* reverseList(struct ListNode* head) { |
234.回文链表
1 | bool isPalindrome(struct ListNode* head) { |
876.链表的中间结点
1 | struct ListNode* middleNode(struct ListNode* head) { |
面试题 02.02. 返回倒数第 k 个节点
1 | int kthToLast(struct ListNode* head, int k) { |
栈
20.有效的括号
1 | bool isValid(char * s){ |
算法分析:
利用另一个数组(栈)储存进入栈的值(仅左括号),读取左括号会更新栈顶(储存在stack数组下一个位置),若读到右括号则与栈顶值比较同时栈顶值前移一位为下次比较做准备。
155.最小栈
1 |
|
1047.删除字符串中所有相邻重复项
1 | char * removeDuplicates(char * S) { |
树
1 | /** |
100.相同的树
1 | bool isSameTree(struct TreeNode* p, struct TreeNode* q) { |
572.另一个树的子树
1 | bool compare(struct TreeNode* s, struct TreeNode* t) { |
1367.二叉树中的列表
1 | bool compare(struct TreeNode* t, struct ListNode* head) { |
101.对称二叉树
1 | bool isMirrorTree(struct TreeNode *p, struct TreeNode *q) |
104.二叉树的最大深度
1 |
|
105.从前序遍历与中序遍历构造二叉树
1 | struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize) { |
106.从中序与后序遍历序列构造二叉树
1 | struct TreeNode* buildTree(int* inorder, int inorderSize, int* postorder, int postorderSize) { |
110.平衡二叉树
1 | // 平衡二叉树是一种二叉排序树,每一个节点的左子树和右子树的高度差至多等于1 |
226.翻转二叉树
1 | struct TreeNode* invertTree(struct TreeNode* root) { |
404.左叶子之和
1 | int sumOfLeftLeaves(struct TreeNode* root) { |
235.二叉搜索树的最近公共祖先
1 |
|
1382.将二叉搜索树变平衡
1 | void inOrderTraverse(struct TreeNode* root, int* pos, int arr[]) { |
- Post link: http://yoursite.com/2020/12/14/Leetcode%E5%88%B7%E9%A2%98/
- Copyright Notice: All articles in this blog are licensed under unless otherwise stated.
若没有本文 Issue,您可以使用 Comment 模版新建。
GitHub Issues