diff --git a/problems/0015.三数之和.md b/problems/0015.三数之和.md
index 985cb76c..2fddb401 100644
--- a/problems/0015.三数之和.md
+++ b/problems/0015.三数之和.md
@@ -1,10 +1,28 @@
-## 题目地址
+# 题目地址
https://leetcode-cn.com/problems/3sum/
-## 思路
+> 用哈希表解决了[两数之和](https://mp.weixin.qq.com/s/uVAtjOHSeqymV8FeQbliJQ),那么三数之和呢?
-### 哈希解法
+# 第15题. 三数之和
+给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
+
+**注意:** 答案中不可以包含重复的三元组。
+
+示例:
+
+给定数组 nums = [-1, 0, 1, 2, -1, -4],
+
+满足要求的三元组集合为:
+[
+ [-1, 0, 1],
+ [-1, -1, 2]
+]
+
+
+# 思路
+
+## 哈希解法
两层for循环就可以确定 a 和b 的数值了,可以使用哈希法来确定 0-(a+b) 是否在 数组里出现过,其实这个思路是正确的,但是我们有一个非常棘手的问题,就是题目中说的不可以包含重复的三元组。
@@ -12,33 +30,11 @@ https://leetcode-cn.com/problems/3sum/
去重的过程不好处理,有很多小细节,如果在面试中很难想到位。
-时间复杂度:O(n^2),但是运行时间很长,不好做剪枝操作
+时间复杂度可以做到O(n^2),但还是比较费时的,因为不好做剪枝操作。
-### 双指针
-
-**其实这道题目使用哈希法并不十分合适**,因为在去重的操作中有很多细节需要注意,在面试中很难直接写出没有bug的代码,而且是用哈希法 在使用两层for循环的时候,能做的剪枝操作很有限,虽然时间复杂度是O(n^2),也是可以在leetcode上通过,但是程序的执行时间依然比较长 。
-
-接下来我来介绍另一个解法:双指针法,**这道题目使用双指针法 要比哈希法高效一些**,那么来讲解一下具体实现的思路。
-
-动画效果如下:
-
-
-
-拿这个nums数组来举例,首先将数组排序,然后 有一层for循环,i从下表0的地方开始,同时定一个下表left 定义在i+1的位置上,定义下表right 在数组结尾的位置上。
-
-我们依然还是在数组中找到 abc 使得a + b +c =0,我们这里相当于 a = nums[i] b = nums[left] c = nums[right]。
-
-接下来我们如何移动left 和right呢, 如果nums[i] + nums[left] + nums[right] > 0 就说明 此时三数之和大了,因为数组是排序后了,所以right下表就应该想左移动,这样才能让三数之和小一些。
-
-如果 nums[i] + nums[left] + nums[right] < 0 说明 此时 三数之和小了, left 就向右移动,才能让三数之和大一些,直到left与right相遇为止。
-
-
-时间复杂度:O(n^2)
-
-## C++代码
-
-### 哈希法代码
+大家可以尝试使用哈希法写一写,就知道其困难的程度了。
+## 哈希法C++代码
```
class Solution {
public:
@@ -75,7 +71,32 @@ public:
}
};
```
-### 双指针法代码
+
+## 双指针
+
+**其实这道题目使用哈希法并不十分合适**,因为在去重的操作中有很多细节需要注意,在面试中很难直接写出没有bug的代码。
+
+而且使用哈希法 在使用两层for循环的时候,能做的剪枝操作很有限,虽然时间复杂度是O(n^2),也是可以在leetcode上通过,但是程序的执行时间依然比较长 。
+
+接下来我来介绍另一个解法:双指针法,**这道题目使用双指针法 要比哈希法高效一些**,那么来讲解一下具体实现的思路。
+
+动画效果如下:
+
+
+
+拿这个nums数组来举例,首先将数组排序,然后有一层for循环,i从下表0的地方开始,同时定一个下表left 定义在i+1的位置上,定义下表right 在数组结尾的位置上。
+
+依然还是在数组中找到 abc 使得a + b +c =0,我们这里相当于 a = nums[i] b = nums[left] c = nums[right]。
+
+接下来如何移动left 和right呢, 如果nums[i] + nums[left] + nums[right] > 0 就说明 此时三数之和大了,因为数组是排序后了,所以right下表就应该向左移动,这样才能让三数之和小一些。
+
+如果 nums[i] + nums[left] + nums[right] < 0 说明 此时 三数之和小了,left 就向右移动,才能让三数之和大一些,直到left与right相遇为止。
+
+时间复杂度:O(n^2)。
+
+
+## 双指针法C++代码
+
```
class Solution {
public:
@@ -129,5 +150,15 @@ public:
};
```
+# 思考题
+
+既然三数之和可以使用双指针法,我们之前讲过的[两数之和](https://mp.weixin.qq.com/s/uVAtjOHSeqymV8FeQbliJQ),可不可以使用双指针法呢?
+
+如果不能,题意如何更改就可以使用双指针法呢? **大家留言说出自己的想法吧!**
+
+两数之和 就不能使用双指针法,因为[两数之和](https://mp.weixin.qq.com/s/uVAtjOHSeqymV8FeQbliJQ)要求返回的是索引下表, 而双指针法一定要排序,一旦排序之后原数组的索引就被改变了。
+
+如果[两数之和](https://mp.weixin.qq.com/s/uVAtjOHSeqymV8FeQbliJQ)要求返回的是数值的话,就可以使用双指针法了。
+
> 更过算法干货文章持续更新,可以微信搜索「代码随想录」第一时间围观,关注后,回复「Java」「C++」 「python」「简历模板」「数据结构与算法」等等,就可以获得我多年整理的学习资料。
diff --git a/problems/面试题02.07.链表相交.md b/problems/面试题02.07.链表相交.md
new file mode 100644
index 00000000..dfdb4e1a
--- /dev/null
+++ b/problems/面试题02.07.链表相交.md
@@ -0,0 +1,51 @@
+## 题目地址
+https://leetcode-cn.com/problems/intersection-of-two-linked-lists-lcci/
+
+## 思路
+
+本来很简洁明了的一道题,让题目描述搞的云里雾里的。
+
+简单来说,就是求两个链表交点节点的**指针**。 这里同学们要注意,交点不是数值相等,而是指针相等。
+
+## 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;
+ }
+};
+```
diff --git a/video/15.三数之和.gif b/video/15.三数之和.gif
new file mode 100644
index 0000000000000000000000000000000000000000..82e1eabc19d6295497046fd336d45f1347f0dd1a
GIT binary patch
literal 500851
zcmeFac|4R2+y6gf7REaEJwtY~B`GaqNw$Q#x+DpyBrz2d(rg&}Sh6o;>`Ss`-^sqG
z63SARR+1tmzd?0%-FMf$eee6ZpWkzx{*;%>t5?VSbDYQLeIC@;Ro`jj4*mdY2CaVx
z3JPxBx>Zh2PEAd1*REaK+S&D!{&CeG-B5h&})uO-wd
z651bL-8LDdIuL{QhqakM4cQYFQxB$JZhJ~rgJZDlY6WC*CL^_t5-LBfSq38GSPTua
zr=lzbG_gF_9?he-;v&y~Euo$pR>lhZ7RbybTo71jjSuL{o=FPcLk7os!aL3;TQ}OF
zjdc0g&!#AHBk!dsJ*uBI@Nb0bgULEM(pGAYF9y ggI;s*r-yzmssacPApHLY{Qh_R
z9RP#}5dKea^bR0Afbf5C^ezq{Jb>^3!UG5o+|vN}H2)5y{-6FH0Kx+Z4 <6;m<4QCDJrf_
zZ}LwtC#9xN8!zi^kaC(bW1jg*!h79lZiKR0w@kV^59`lHwdcVQoAeq=qE #9uF?&t0O`MlqI`|j@b)Abizx7+=CJf8Ol
zZ@ie^#2QjJrV}NwcJ?hw;NeGja|N@-1jFQ6ys=4sL?gOPJLzQ&$&2$u5o>lm&CSKs
zohuwC^_$4^X6e4Ar?~?Sz}SWz?xc< 2O=9p82!BUHXxfjfNX97u({Kzc8LSX29c)$vU%I}efPu1h-~0Bl+i#6
zHBd==@v^U#_V*zhz%;i)6915C{;nrEtBXI&G{tM=5rbp{{)B<#<_l#5U!w*kH|isw
z?{MgK@W`jyNzPKRgCmBS#uCT|(xBv~Wbnx6%$EZvIXF1Efn@{#jC}UX1}0jkLQIo9
zXykJdA{*G+Agk{i`AmV58;wq0zii+Ybdpo0(Z@8!gOZ!nb~KdScp~*Qh-rXqpaH6<
zrDCAuCI^-cw0u0t>5~oMq2#6*kqykJ^BM+Z1DAd)8|WYTT+_!i$B9cDWZGd2ES%hg
znyJ^*q6a588GXskXJiBB&G%dY#n`p{YVp~G
zsb5ntn|)4GG1&~Mbj%~#E8uE>DwU^h+JKqU!p3bkW={BmYjz}^HVdu9Xx}%AvEt`g
z?m6S2I7#mS%D3n3$q43=>BmoIdTNChLpJHGEq79{z?o@kXBpjiMWl9su7L*YzU{E6
zckMa2bV|>g`By((6n70waRyxj%fnvK-+WmfEiY}N
(|IPeh;wEfxp{58mKeueGOZ~q2@0g&DNBZ#hg_qzL9{;Dh0
z=YRQ0^`Pm<*B7dP{bk1QWjEZbgh3lP;*Wx8WBM13eJ&!S1&NG-Vwz((N~+;FAc*$w
za>C(GsR^Q^E}>E+@YPKe$s(`>BAjZBOr3Dl1ksMj1`d?n7*PK98#n{mjRYc`ltI}|
zizye%Zni60>JhKN83~l#jC_T*MmBH|L9{ke8yWjNj}fSieM+9OpbZ=$OgOJ#uYd(t
z0bSh`v!M-~E+T!9AUdIM17|oyIEWzHzR5K5lkA3vaen`L=jK^I-;K;DYwFK#xP654
zn7CYl*5NX-6lm--u2Y?G_6;VSenIqSvYRe4EQo%qLc7|j5e^RCz)|#PH@7Sp@YM}D
z3?ZDqYIcLSCP)!MbPpgLAc%f8h;aN-s82U=p7#;Xxj!JBlpg74vYSOHk>_!j>v_w5
z%=13|ZwR7A
W$)86#`u~~3
zoKMVZMSb3Z!E2wNIn4Q2);<$IALSIO)z_@PXzkM;q8yRlNL8aXyJJZ-G>B6hZ64u9
zgPhSPX?$Y+aq4u2vN$}{iGTxUwRA4Yqnkvfqr@_J?K5t;eIP-f6Ks{8f+jaJXft|2
z{c3Z2tUiYkp|9;{EdqW3FAhl-XsT(=bo6)Qp-tj>MBg^jkd0h|mRL36I1z0uj*n2-
z%hB`O*i;wQvfKhWo`u5dw2^6ZT~XSLL(taDQ5u>IG-*{4YE(&yrY2KHS_sBGQLiJk
zywTc5xwY$8$gl>J(WEB}e1QgzH`=>H%bZ)giq?)HUgLnZPdt7P2RAanRBH+`e^D)m
zKbpzXnuID|