双指针
两个点 p 、 q p、q p、q 赛跑,分别从 A A A 和 B B B 的头结点同时出发, p p p 跑完 A A A 去跑 B B B , q q q 跑完 B B B 去跑 A A A ,两个点终将相遇,相遇点就是相交结点。
证明 :
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode *p = headA, *q = headB;
while(p!=q){
p = p? p ->next : headB;
q = q? q ->next : headA;
}
return p;
}
};
- 时间复杂度 : O ( n + m ) O(n+m) O(n+m) , n n n 是链表 A A A 结点的数量, m m m 是链表 B B B 结点的数量,最多遍历所有结点两遍,时间复杂度 O ( n + m ) O(n+m) O(n+m) 。
- 空间复杂度 : O ( 1 ) O(1) O(1) , 只使用常量级空间 。
AC
致语
- 理解思路很重要
- 读者有问题请留言,清墨看到就会回复的。