Skip to content

Commit a634dbd

Browse files
Update
1 parent fea16ee commit a634dbd

File tree

3 files changed

+134
-28
lines changed

3 files changed

+134
-28
lines changed

README.md

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,17 @@
2323

2424
很多刚开始刷题的同学都有一个困惑:面对leetcode上近两千道题目,从何刷起。
2525

26+
大家平时刷题感觉效率低,浪费的时间主要在三点:
27+
28+
* 找题
29+
* 找到了不应该现阶段做的题
30+
* 没有全套的优质题解可以参考
31+
2632
其实我之前在知乎上回答过这个问题,回答内容大概是按照如下类型来刷数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心->动态规划->图论->高级数据结构,再从简单刷起,做了几个类型题目之后,再慢慢做中等题目、困难题目。
2733

2834
但我能设身处地的感受到:即使有这样一个整体规划,对于一位初学者甚至算法老手寻找合适自己的题目也是很困难,时间成本很高,而且题目还不一定就是经典题目。
2935

30-
对于刷题,我们都是想用最短的时间把经典题目都做一篇,这样效率才是最高的!
36+
对于刷题,我们都是想用最短的时间**按照循序渐进的难度顺序把经典题目都做一遍**,这样效率才是最高的!
3137

3238
所以我整理了leetcode刷题攻略:一个超级详细的刷题顺序,**每道题目都是我精心筛选,都是经典题目高频面试题**,大家只要按照这个顺序刷就可以了,**你没看错,就是题目顺序都排好了,文章顺序就是刷题顺序!挨个刷就可以,不用自己再去题海里选题了!**
3339

@@ -49,15 +55,18 @@
4955

5056
**目前已经更新了,数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心,八个专题了,正在讲解动态规划!**
5157

52-
在刷题指南中,每个专题开始都有理论基础篇,并不像是教科书般的理论介绍,而是从实战中归纳需要的基础知识。每个专题结束都有总结篇,最这个专题的归纳总结。
58+
在刷题攻略中,每个专题开始都有理论基础篇,并不像是教科书般的理论介绍,而是从实战中归纳需要的基础知识。每个专题结束都有总结篇,最这个专题的归纳总结。
5359

5460
如果你是算法老手,这篇攻略也是复习的最佳资料,如果把每个系列对应的总结篇,快速过一遍,整个算法知识体系以及各种解法就重现脑海了。
5561

56-
在按照如下顺序刷题的过程中,每一道题解一定要看对应文章下面的留言(留言目前只能在手机端查看)。
5762

58-
如果你有疑问或者发现文章哪里有不对的地方,都可以在留言区都能找到答案,还有很多录友的总结非常赞,看完之后也很有收获。
63+
目前「代码随想录」刷题攻略更新了:**200多篇文章,精讲了200道经典算法题目,共60w字的详细图解,部分难点题目还搭配了20分钟左右的视频讲解**
64+
65+
**这里每一篇题解,都是精品,值得仔细琢磨**
66+
67+
我在题目讲解中统一用C++语言,但你会发现下面几乎每篇题解都配有其他语言版本,Java、Python、Go、JavaScript等等,这正是热心小伙们的贡献的代码,当然我也会严格把控代码质量。
5968

60-
目前「代码随想录」刷题指南更新了:**200多篇文章,精讲了200道经典算法题目,共60w字的详细图解,部分难点题目还搭配了20分钟左右的视频讲解**
69+
**所以也欢迎大家参与进来,完善题解的各个语言版本,拥抱开源,让更多小伙伴们收益**
6170

6271
准备好了么,刷题攻略开始咯,go go go!
6372

@@ -66,7 +75,7 @@
6675
## 前序
6776

6877
* [「代码随想录」后序安排](https://mp.weixin.qq.com/s/4eeGJREy6E-v6D7cR_5A4g)
69-
* [「代码随想录」学习社区](https://mp.weixin.qq.com/s/X1XCH-KevURi3LnakJsCkA)
78+
* [「代码随想录」学习社区](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
7079

7180

7281
* 编程语言
@@ -119,8 +128,9 @@
119128
4. [链表:听说过两天反转链表又写不出来了?](./problems/0206.翻转链表.md)
120129
5. [链表:两两交换链表中的节点](./problems/0024.两两交换链表中的节点.md)
121130
6. [链表:删除链表的倒数第 N 个结点](./problems/0019.删除链表的倒数第N个节点.md)
122-
7. [链表:环找到了,那入口呢?](./problems/0142.环形链表II.md)
123-
8. [链表:总结篇!](./problems/链表总结篇.md)
131+
7. [链表:链表相交](./problems/面试题02.07.链表相交.md)
132+
8. [链表:环找到了,那入口呢?](./problems/0142.环形链表II.md)
133+
9. [链表:总结篇!](./problems/链表总结篇.md)
124134

125135
## 哈希表
126136

@@ -156,11 +166,13 @@
156166
3. [字符串:替换空格](./problems/剑指Offer05.替换空格.md)
157167
4. [字符串:花式反转还不够!](./problems/0151.翻转字符串里的单词.md)
158168
5. [链表:听说过两天反转链表又写不出来了?](./problems/0206.翻转链表.md)
159-
6. [链表:环找到了,那入口呢?](./problems/0142.环形链表II.md)
160-
7. [链表:删除链表的倒数第 N 个结点](./problems/0019.删除链表的倒数第N个节点.md)
161-
8. [哈希表:解决了两数之和,那么能解决三数之和么?](./problems/0015.三数之和.md)
162-
9. [双指针法:一样的道理,能解决四数之和](./problems/0018.四数之和.md)
163-
10. [双指针法:总结篇!](./problems/双指针总结.md)
169+
6. [链表:删除链表的倒数第 N 个结点](./problems/0019.删除链表的倒数第N个节点.md)
170+
7. [链表:链表相交](./problems/面试题02.07.链表相交.md)
171+
8. [链表:环找到了,那入口呢?](./problems/0142.环形链表II.md)
172+
9. [链表:删除链表的倒数第 N 个结点](./problems/0019.删除链表的倒数第N个节点.md)
173+
10. [哈希表:解决了两数之和,那么能解决三数之和么?](./problems/0015.三数之和.md)
174+
11. [双指针法:一样的道理,能解决四数之和](./problems/0018.四数之和.md)
175+
12. [双指针法:总结篇!](./problems/双指针总结.md)
164176

165177
## 栈与队列
166178

problems/数组理论基础.md

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -118,21 +118,6 @@ public static void test_arr() {
118118

119119
这里面试中数组相关的理论知识就介绍完了。
120120

121-
后续我将介绍面试中数组相关的五道经典面试题目,敬请期待!
122-
123-
124-
## 其他语言版本
125-
126-
127-
Java:
128-
129-
130-
Python:
131-
132-
133-
Go:
134-
135-
136121

137122

138123
-----------------------
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
2+
<p align="center">
3+
<a href="https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ"><img src="https://img.shields.io/badge/知识星球-代码随想录-blue" alt=""></a>
4+
<a href="https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw"><img src="https://img.shields.io/badge/刷题-微信群-green" alt=""></a>
5+
<a href="https://img-blog.csdnimg.cn/20201210231711160.png"><img src="https://img.shields.io/badge/公众号-代码随想录-brightgreen" alt=""></a>
6+
<a href="https://space.bilibili.com/525438321"><img src="https://img.shields.io/badge/B站-代码随想录-orange" alt=""></a>
7+
</p>
8+
<p align="center"><strong>欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
9+
10+
## 面试题 02.07. 链表相交
11+
12+
题目链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists-lcci/
13+
14+
给定两个(单向)链表,判定它们是否相交并返回交点。请注意相交的定义基于节点的引用,而不是基于节点的值。换句话说,如果一个链表的第k个节点与另一个链表的第j个节点是同一节点(引用完全相同),则这两个链表相交。
15+
16+
示例 1:
17+
18+
输入:listA = [4,1,8,4,5], listB = [5,0,1,8,4,5]
19+
20+
输出:Reference of the node with value = 8
21+
22+
输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
23+
24+
25+
## 思路
26+
27+
本来很简洁明了的一道题,让题目描述搞的云里雾里的。
28+
29+
简单来说,就是求两个链表交点节点的**指针**。 这里同学们要注意,交点不是数值相等,而是指针相等。
30+
31+
为了方便举例,假设节点元素数值相等,则节点指针相等。
32+
33+
看如下两个链表,目前curA指向链表A的头结点,curB指向链表B的头结点:
34+
35+
![面试题02.07.链表相交_1](https://code-thinking.cdn.bcebos.com/pics/%E9%9D%A2%E8%AF%95%E9%A2%9802.07.%E9%93%BE%E8%A1%A8%E7%9B%B8%E4%BA%A4_1.png)v
36+
37+
我们求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置,如图:
38+
39+
![面试题02.07.链表相交_2](https://code-thinking.cdn.bcebos.com/pics/%E9%9D%A2%E8%AF%95%E9%A2%9802.07.%E9%93%BE%E8%A1%A8%E7%9B%B8%E4%BA%A4_2.png)
40+
41+
此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到焦点。
42+
43+
否则循环退出返回空指针。
44+
45+
C++代码如下:
46+
47+
```C++
48+
class Solution {
49+
public:
50+
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
51+
ListNode* curA = headA;
52+
ListNode* curB = headB;
53+
int lenA = 0, lenB = 0;
54+
while (curA != NULL) { // 求链表A的长度
55+
lenA++;
56+
curA = curA->next;
57+
}
58+
while (curB != NULL) { // 求链表B的长度
59+
lenB++;
60+
curB = curB->next;
61+
}
62+
curA = headA;
63+
curB = headB;
64+
// 让curA为最长链表的头,lenA为其长度
65+
if (lenB > lenA) {
66+
swap (lenA, lenB);
67+
swap (curA, curB);
68+
}
69+
// 求长度差
70+
int gap = lenA - lenB;
71+
// 让curA和curB在同一起点上(末尾位置对齐)
72+
while (gap--) {
73+
curA = curA->next;
74+
}
75+
// 遍历curA 和 curB,遇到相同则直接返回
76+
while (curA != NULL) {
77+
if (curA == curB) {
78+
return curA;
79+
}
80+
curA = curA->next;
81+
curB = curB->next;
82+
}
83+
return NULL;
84+
}
85+
};
86+
```
87+
88+
* 时间复杂度:$O(n + m)$
89+
* 空间复杂度:$O(1)$
90+
91+
## 其他语言版本
92+
93+
94+
Java:
95+
96+
97+
Python:
98+
99+
100+
Go:
101+
102+
103+
104+
105+
-----------------------
106+
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
107+
* B站视频:[代码随想录](https://space.bilibili.com/525438321)
108+
* 知识星球:[代码随想录](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
109+
<div align="center"><img src=../pics/公众号.png width=450 alt=> </img></div>

0 commit comments

Comments
 (0)