mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-06 23:28:29 +08:00
Update
This commit is contained in:
38
README.md
38
README.md
@ -23,11 +23,17 @@
|
||||
|
||||
很多刚开始刷题的同学都有一个困惑:面对leetcode上近两千道题目,从何刷起。
|
||||
|
||||
大家平时刷题感觉效率低,浪费的时间主要在三点:
|
||||
|
||||
* 找题
|
||||
* 找到了不应该现阶段做的题
|
||||
* 没有全套的优质题解可以参考
|
||||
|
||||
其实我之前在知乎上回答过这个问题,回答内容大概是按照如下类型来刷数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心->动态规划->图论->高级数据结构,再从简单刷起,做了几个类型题目之后,再慢慢做中等题目、困难题目。
|
||||
|
||||
但我能设身处地的感受到:即使有这样一个整体规划,对于一位初学者甚至算法老手寻找合适自己的题目也是很困难,时间成本很高,而且题目还不一定就是经典题目。
|
||||
|
||||
对于刷题,我们都是想用最短的时间把经典题目都做一篇,这样效率才是最高的!
|
||||
对于刷题,我们都是想用最短的时间**按照循序渐进的难度顺序把经典题目都做一遍**,这样效率才是最高的!
|
||||
|
||||
所以我整理了leetcode刷题攻略:一个超级详细的刷题顺序,**每道题目都是我精心筛选,都是经典题目高频面试题**,大家只要按照这个顺序刷就可以了,**你没看错,就是题目顺序都排好了,文章顺序就是刷题顺序!挨个刷就可以,不用自己再去题海里选题了!**
|
||||
|
||||
@ -49,15 +55,18 @@
|
||||
|
||||
**目前已经更新了,数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心,八个专题了,正在讲解动态规划!**
|
||||
|
||||
在刷题指南中,每个专题开始都有理论基础篇,并不像是教科书般的理论介绍,而是从实战中归纳需要的基础知识。每个专题结束都有总结篇,最这个专题的归纳总结。
|
||||
在刷题攻略中,每个专题开始都有理论基础篇,并不像是教科书般的理论介绍,而是从实战中归纳需要的基础知识。每个专题结束都有总结篇,最这个专题的归纳总结。
|
||||
|
||||
如果你是算法老手,这篇攻略也是复习的最佳资料,如果把每个系列对应的总结篇,快速过一遍,整个算法知识体系以及各种解法就重现脑海了。
|
||||
|
||||
在按照如下顺序刷题的过程中,每一道题解一定要看对应文章下面的留言(留言目前只能在手机端查看)。
|
||||
|
||||
如果你有疑问或者发现文章哪里有不对的地方,都可以在留言区都能找到答案,还有很多录友的总结非常赞,看完之后也很有收获。
|
||||
目前「代码随想录」刷题攻略更新了:**200多篇文章,精讲了200道经典算法题目,共60w字的详细图解,部分难点题目还搭配了20分钟左右的视频讲解**。
|
||||
|
||||
目前「代码随想录」刷题指南更新了:**200多篇文章,精讲了200道经典算法题目,共60w字的详细图解,部分难点题目还搭配了20分钟左右的视频讲解**。
|
||||
**这里每一篇题解,都是精品,值得仔细琢磨**。
|
||||
|
||||
我在题目讲解中统一用C++语言,但你会发现下面几乎每篇题解都配有其他语言版本,Java、Python、Go、JavaScript等等,这正是热心小伙们的贡献的代码,当然我也会严格把控代码质量。
|
||||
|
||||
**所以也欢迎大家参与进来,完善题解的各个语言版本,拥抱开源,让更多小伙伴们收益**。
|
||||
|
||||
准备好了么,刷题攻略开始咯,go go go!
|
||||
|
||||
@ -66,7 +75,7 @@
|
||||
## 前序
|
||||
|
||||
* [「代码随想录」后序安排](https://mp.weixin.qq.com/s/4eeGJREy6E-v6D7cR_5A4g)
|
||||
* [「代码随想录」学习社区](https://mp.weixin.qq.com/s/X1XCH-KevURi3LnakJsCkA)
|
||||
* [「代码随想录」学习社区](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
|
||||
|
||||
|
||||
* 编程语言
|
||||
@ -119,8 +128,9 @@
|
||||
4. [链表:听说过两天反转链表又写不出来了?](./problems/0206.翻转链表.md)
|
||||
5. [链表:两两交换链表中的节点](./problems/0024.两两交换链表中的节点.md)
|
||||
6. [链表:删除链表的倒数第 N 个结点](./problems/0019.删除链表的倒数第N个节点.md)
|
||||
7. [链表:环找到了,那入口呢?](./problems/0142.环形链表II.md)
|
||||
8. [链表:总结篇!](./problems/链表总结篇.md)
|
||||
7. [链表:链表相交](./problems/面试题02.07.链表相交.md)
|
||||
8. [链表:环找到了,那入口呢?](./problems/0142.环形链表II.md)
|
||||
9. [链表:总结篇!](./problems/链表总结篇.md)
|
||||
|
||||
## 哈希表
|
||||
|
||||
@ -156,11 +166,13 @@
|
||||
3. [字符串:替换空格](./problems/剑指Offer05.替换空格.md)
|
||||
4. [字符串:花式反转还不够!](./problems/0151.翻转字符串里的单词.md)
|
||||
5. [链表:听说过两天反转链表又写不出来了?](./problems/0206.翻转链表.md)
|
||||
6. [链表:环找到了,那入口呢?](./problems/0142.环形链表II.md)
|
||||
7. [链表:删除链表的倒数第 N 个结点](./problems/0019.删除链表的倒数第N个节点.md)
|
||||
8. [哈希表:解决了两数之和,那么能解决三数之和么?](./problems/0015.三数之和.md)
|
||||
9. [双指针法:一样的道理,能解决四数之和](./problems/0018.四数之和.md)
|
||||
10. [双指针法:总结篇!](./problems/双指针总结.md)
|
||||
6. [链表:删除链表的倒数第 N 个结点](./problems/0019.删除链表的倒数第N个节点.md)
|
||||
7. [链表:链表相交](./problems/面试题02.07.链表相交.md)
|
||||
8. [链表:环找到了,那入口呢?](./problems/0142.环形链表II.md)
|
||||
9. [链表:删除链表的倒数第 N 个结点](./problems/0019.删除链表的倒数第N个节点.md)
|
||||
10. [哈希表:解决了两数之和,那么能解决三数之和么?](./problems/0015.三数之和.md)
|
||||
11. [双指针法:一样的道理,能解决四数之和](./problems/0018.四数之和.md)
|
||||
12. [双指针法:总结篇!](./problems/双指针总结.md)
|
||||
|
||||
## 栈与队列
|
||||
|
||||
|
@ -118,21 +118,6 @@ public static void test_arr() {
|
||||
|
||||
这里面试中数组相关的理论知识就介绍完了。
|
||||
|
||||
后续我将介绍面试中数组相关的五道经典面试题目,敬请期待!
|
||||
|
||||
|
||||
## 其他语言版本
|
||||
|
||||
|
||||
Java:
|
||||
|
||||
|
||||
Python:
|
||||
|
||||
|
||||
Go:
|
||||
|
||||
|
||||
|
||||
|
||||
-----------------------
|
||||
|
109
problems/面试题02.07.链表相交.md
Normal file
109
problems/面试题02.07.链表相交.md
Normal file
@ -0,0 +1,109 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ"><img src="https://img.shields.io/badge/知识星球-代码随想录-blue" alt=""></a>
|
||||
<a href="https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw"><img src="https://img.shields.io/badge/刷题-微信群-green" alt=""></a>
|
||||
<a href="https://img-blog.csdnimg.cn/20201210231711160.png"><img src="https://img.shields.io/badge/公众号-代码随想录-brightgreen" alt=""></a>
|
||||
<a href="https://space.bilibili.com/525438321"><img src="https://img.shields.io/badge/B站-代码随想录-orange" alt=""></a>
|
||||
</p>
|
||||
<p align="center"><strong>欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
|
||||
|
||||
## 面试题 02.07. 链表相交
|
||||
|
||||
题目链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists-lcci/
|
||||
|
||||
给定两个(单向)链表,判定它们是否相交并返回交点。请注意相交的定义基于节点的引用,而不是基于节点的值。换句话说,如果一个链表的第k个节点与另一个链表的第j个节点是同一节点(引用完全相同),则这两个链表相交。
|
||||
|
||||
示例 1:
|
||||
|
||||
输入:listA = [4,1,8,4,5], listB = [5,0,1,8,4,5]
|
||||
|
||||
输出:Reference of the node with value = 8
|
||||
|
||||
输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
|
||||
|
||||
|
||||
## 思路
|
||||
|
||||
本来很简洁明了的一道题,让题目描述搞的云里雾里的。
|
||||
|
||||
简单来说,就是求两个链表交点节点的**指针**。 这里同学们要注意,交点不是数值相等,而是指针相等。
|
||||
|
||||
为了方便举例,假设节点元素数值相等,则节点指针相等。
|
||||
|
||||
看如下两个链表,目前curA指向链表A的头结点,curB指向链表B的头结点:
|
||||
|
||||
v
|
||||
|
||||
我们求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置,如图:
|
||||
|
||||

|
||||
|
||||
此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到焦点。
|
||||
|
||||
否则循环退出返回空指针。
|
||||
|
||||
C++代码如下:
|
||||
|
||||
```C++
|
||||
class Solution {
|
||||
public:
|
||||
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
|
||||
ListNode* curA = headA;
|
||||
ListNode* curB = headB;
|
||||
int lenA = 0, lenB = 0;
|
||||
while (curA != NULL) { // 求链表A的长度
|
||||
lenA++;
|
||||
curA = curA->next;
|
||||
}
|
||||
while (curB != NULL) { // 求链表B的长度
|
||||
lenB++;
|
||||
curB = curB->next;
|
||||
}
|
||||
curA = headA;
|
||||
curB = headB;
|
||||
// 让curA为最长链表的头,lenA为其长度
|
||||
if (lenB > lenA) {
|
||||
swap (lenA, lenB);
|
||||
swap (curA, curB);
|
||||
}
|
||||
// 求长度差
|
||||
int gap = lenA - lenB;
|
||||
// 让curA和curB在同一起点上(末尾位置对齐)
|
||||
while (gap--) {
|
||||
curA = curA->next;
|
||||
}
|
||||
// 遍历curA 和 curB,遇到相同则直接返回
|
||||
while (curA != NULL) {
|
||||
if (curA == curB) {
|
||||
return curA;
|
||||
}
|
||||
curA = curA->next;
|
||||
curB = curB->next;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
* 时间复杂度:$O(n + m)$
|
||||
* 空间复杂度:$O(1)$
|
||||
|
||||
## 其他语言版本
|
||||
|
||||
|
||||
Java:
|
||||
|
||||
|
||||
Python:
|
||||
|
||||
|
||||
Go:
|
||||
|
||||
|
||||
|
||||
|
||||
-----------------------
|
||||
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
|
||||
* B站视频:[代码随想录](https://space.bilibili.com/525438321)
|
||||
* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
|
||||
<div align="center"><img src=../pics/公众号.png width=450 alt=> </img></div>
|
Reference in New Issue
Block a user