LeetCode 总结
总结了一些自己在做LeetCode中遇到的一些问题以及解题思路
小橙爱编程
努力做programmer里最会dance的dancer,做dancer里最会coding的programmer
展开
-
LeetCode 两两交换链表中的节点(无需辅助结点)
非递归、无需额外辅助结点(真就硬交换)/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* swapPairs(ListNode* head) { if原创 2020-08-13 22:15:31 · 119 阅读 · 0 评论 -
LeetCode求1+2+...+n的结果(限定算法条件)
看似一道很简单的题,在LeetCode中却给到了中等难度的定义,主要的原因是题目限制了使用条件:要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。我们先想想常规的解决思路有哪些:如果不限制乘除法的话,我们可以直接使用等差数列求和公式就解决了:(n+1)∗n/2(n+1)*n/2(n+1)∗n/2。但这个方法最大的问题在于无法通过别的运算法转换乘以n的问题(尽管我们知道乘除可以通过位运算来间接实现,但运算只能限于2的倍数的乘法,如果是乘以3、原创 2020-08-12 14:36:17 · 2061 阅读 · 0 评论 -
LeetCode单链表删除中间结点(仅传递被删除结点)
这个题难度并不是很大,主要考察了对链表数据结构的灵活使用能力,有点脑筋急转弯的意思。题目要点:删除一条单链表的中间结点(不是第一个或者最后一个),参数只传递了被删除的结点的指针。打眼一看其实是有点懵的,因为平常的删除都需要知道被删结点的前一个结点,这样才能将前一个结点之间连接到被删的下一个结点,这里无法获取被删结点的前面所有结点,因而我们的常规思路是无法进行。但想来想去,删除链表只有这一种思路,在这种思路下我们只能删除后面的结点,等等!可以删除后面的结点…emmmmm…我懂了,我们直接采用“替罪羊删原创 2020-08-10 17:23:06 · 145 阅读 · 0 评论 -
LeetCode 单链表判断是否存在回文 O(1)空间复杂度
利用的思想是小学奥数常见的追及问题思路:如果存在回路,当两个速度不同的指针在其中不断循环时,一定会出现追及问题如何体现速度不同:一个指针一次只跳一个结点,另一个指针一次跳两个(或多个)结点。如何体现追及:判断两个指针所指向的内容是否是同一块地址区间。代码 * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : v原创 2020-06-22 21:14:42 · 262 阅读 · 0 评论 -
LeetCode 单链表判断回文开始结点 O(1)空间复杂度
上次讲了如何实现判断单链表中是否存在回文这次我们将算法提升一下,判断在哪里将会产生回文。如果没有链表中无回路则直接返回NULL既然是算法提升,说明之前的算法仍有它的可取之处,分析一下,我们可以将此任务分为两步来解决:①判断链表是否有回文,如果没有则直接返回NULL;②如果有回文,如何利用数学分析来找到回文开始结点并返回该结点。该题选自LeetCode 142,有兴趣的朋友可以直接去看看。思路分析首先我们仍然采用追击算法的思想,即当两个指针在回文里循环时,如果发生追击现象,则说明链表内有回文,否原创 2020-06-22 23:17:11 · 256 阅读 · 0 评论