LeetCode 160 | 相交链表
题目
题解
- 暴力:
两层循环扫描两条链表,找到相交结点。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
auto p1=headA,p2=headB;
while(p1){
while(p2){
if(p1==p2)return p1;
p2=p2->next;
}
p1=p1->next;
p2=headB;
}
return nullptr;
}
};
- 哈希:用O(n)的空间换取O(n)的时间变为O(1)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
set<ListNode*> seen;
while(headA){
seen.insert(headA);
headA=headA->next;
}
while(headB){
auto fd=seen.find(headB);
if(fd!=seen.end())return *fd;
headB=headB->next;
}
return nullptr;
}
};
- 双指针
简单计算可以发现,两条链表走完各自的长度加上另一条链表的非公共部分的长度是一样的(记为len吧。)也就是说设置分别指向两条链表的两个指针p1,p2;分别走完各自链表,遇到尾结点则转向另一条链表的头结点开始走,两个指针总会在len步之后遇到,若两条链表没有交点则len步之后p1,p2指向为空。否则就是两条链表的相交结点。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(headA==nullptr||headB==nullptr)return nullptr;
auto p1=headA,p2=headB;
while(p1!=p2){
if(p1==nullptr)p1=headB;
else p1=p1->next;
if(p2==nullptr)p2=headA;
else p2=p2->next;
}
return p1;
}
};