mirror of
https://github.com/chefyuan/algorithm-base.git
synced 2025-08-03 14:32:07 +00:00
链表专题更新cpp代码
This commit is contained in:
@@ -26,14 +26,18 @@
|
||||
|
||||
### HashSet
|
||||
|
||||
这个方法是比较简单的,主要思路就是,先遍历一个链表将链表的所有值都存到哈希表中,然后再遍历另一个链表,如果发现某个结点在哈希表中已经存在那我们直接返回该节点即可,代码也很简单。
|
||||
这个方法是比较简单的,主要思路就是,先遍历一个链表将链表的所有值都存到Hashset中,然后再遍历另一个链表,如果发现某个结点在Hashset中已经存在那我们直接返回该节点即可,代码也很简单。
|
||||
|
||||
**题目代码**
|
||||
|
||||
Java Code:
|
||||
|
||||
```java
|
||||
public class Solution {
|
||||
public ListNode getIntersectionNode (ListNode headA, ListNode headB) {
|
||||
ListNode tempa = headA;
|
||||
ListNode tempb = headB;
|
||||
//定义hash表
|
||||
//定义Hashset
|
||||
HashSet<ListNode> arr = new HashSet<ListNode>();
|
||||
while (tempa != null) {
|
||||
arr.add(tempa);
|
||||
@@ -45,12 +49,36 @@ public class Solution {
|
||||
}
|
||||
tempb = tempb.next;
|
||||
}
|
||||
return tempb;
|
||||
|
||||
return tempb;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
C++ Code:
|
||||
|
||||
```cpp
|
||||
class Solution {
|
||||
public:
|
||||
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
|
||||
ListNode * tempa = headA;
|
||||
ListNode * tempb = headB;
|
||||
//定义Hashset, cpp对应set
|
||||
set <ListNode *> arr;
|
||||
while (tempa != nullptr) {
|
||||
arr.insert(tempa);
|
||||
tempa = tempa->next;
|
||||
}
|
||||
while (tempb != nullptr) {
|
||||
if (arr.find(tempb) != arr.end()) {
|
||||
return tempb;
|
||||
}
|
||||
tempb = tempb->next;
|
||||
}
|
||||
return tempb;
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
下面这个方法比较巧妙,不是特别容易想到,大家可以自己实现一下,这个方法也是利用我们的双指针思想。
|
||||
|
||||
下面我们直接看动图吧,特别直观,一下就可以搞懂。
|
||||
@@ -59,6 +87,10 @@ public class Solution {
|
||||
|
||||
是不是一下就懂了呀,我们利用双指针,当某一指针遍历完链表之后,然后掉头去另一个链表的头部,继续遍历。因为速度相同所以他们第二次遍历的时候肯定会相遇,是不是很浪漫啊!
|
||||
|
||||
**题目代码**
|
||||
|
||||
Java Code:
|
||||
|
||||
```java
|
||||
public class Solution {
|
||||
public ListNode getIntersectionNode (ListNode headA, ListNode headB) {
|
||||
@@ -76,7 +108,25 @@ public class Solution {
|
||||
}
|
||||
```
|
||||
|
||||
C++ Code:
|
||||
|
||||
```cpp
|
||||
class Solution {
|
||||
public:
|
||||
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
|
||||
//定义两个节点
|
||||
ListNode * tempa = headA;
|
||||
ListNode * tempb = headB;
|
||||
//循环
|
||||
while (tempa != tempb) {
|
||||
//如果不为空就指针下移,为空就跳到另一链表的头部
|
||||
tempa = tempa != nullptr ? tempa->next: headB;
|
||||
tempb = tempb != nullptr ? tempb->next: headA;
|
||||
}
|
||||
return tempa;
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
好啦,链表的题目就结束啦,希望大家能有所收获,下周就要更新新的题型啦,继续坚持,肯定会有收获的。
|
||||
|
||||
|
Reference in New Issue
Block a user