160相交链表
写在前面,小白从零刷题,在解答会写出思路,正确答案,以及所有使用到的语法和知识点
1. 双指针
- 思路就是很简单下面注释
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode *a=headA;
ListNode *b=headB;
int i=0,j=0,gap=0,value=0;
while(headA!=nullptr){
headA=headA->next;
i++;
}
while(headB!=nullptr){
headB=headB->next;
j++;
}
//首先遍历链表长度
if(i>j) {
gap=i-j;
while(gap){
gap--;
a=a->next;
}
}
else{
gap=j-i;
while(gap){
gap--;//不在循环里面写自减自加符号
b=b->next;
}
}
//求的俩链表长度差,并指向同一长度的节点
while(a!=nullptr){
if(a==b) {
return a;
}
b=b->next;
a=a->next;
}
return nullptr;
}
};//遍历到指向同一节点时,返回该指针
2. 双指针解法2
- 思路就是利用两个链表相加长度和一致,所以当一个两者中短链表遍历完之后,将其指向长链表,如果有共同节点,最终一定会相遇
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(headA==NULL||headB==NULL) return nullptr;
ListNode *a=headA,*b=headB;//一般都要定义两个指针,以免破坏结构
while(a!=b){
a=a->next;
b=b->next;
if(a==NULL&&b==NULL) return nullptr;
if(a==NULL){
a=headB;//指向
}
if(b==NULL){
b=headA;
}
}
return a;
}
};
简洁答案
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(headA == nullptr || headB == nullptr)
return nullptr;
ListNode* cur_a = headA;
ListNode* cur_b = headB;
while(cur_a != cur_b)
{
cur_a = (cur_a ? cur_a->next : headB);//这句是精华,赋值语句中如果需要判断则可以使用这个
cur_b = (cur_b ? cur_b->next : headA);
}
return cur_a;
}
};
3. 哈希表
参考一下别人的代码
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
std::unordered_set<ListNode*> set;
ListNode* cur_a = headA;
while (cur_a)
{
set.insert(cur_a);
cur_a = cur_a->next;
}
ListNode* cur_b = headB;
while (cur_b)
{
if(set.find(cur_b) != set.end()) //找到了
{
return cur_b;
}
cur_b = cur_b->next;
}
return nullptr;
}
};
自己的代码
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
unordered_set<ListNode*>res;//这个地方只需要存储指针不需要存放值
while(headA!=nullptr){//这个地方可以直接写成指针//headA
res.insert(headA);
headA=headA->next;//set与map不同set只能通过insert插入元素
}
while(headB!=nullptr){
auto it=find(res.begin(),res.end(),headB);//奇怪我将这个地方改为res.find就可以通过了不超过时间限制了
if(it==res.end()) headB=headB->next;
else return *it;//注意这里应该是迭代器的解引用
}
return nullptr;
}
};
知识点
时间复杂度/空间复杂度分析/面试场景如何作答
方法一
- 时间复杂度:O(n)
- 空间复杂度: 空间复杂度为O(1)