输入两个链表,找出它们的第一个公共结点。
当不存在公共节点时,返回空节点。
样例
给出两个链表如下所示:
A: a1 → a2
↘
c1 → c2 → c3
↗
B: b1 → b2 → b3
输出第一个公共节点c1
这道题的思路比较的巧妙: 思想是 两指针走相同的距离一定会在交点(如果有的话)相交
if (s) // 这样在沿着单链表上走的时候,最后s等于null
s = s -> next;
if (s -> next) // 这样在沿着单链表上走的时候,最后s等于链表上的最后一个非空结点
s = s- > next;
不论两条单链表是不是有相交结点,在走自己走完后走别人的链表,如果没有交点,最后都将变成nullptr,如果有相交结点那么就会停在交点处。
class Solution {
public:
ListNode *findFirstCommonNode(ListNode *headA, ListNode *headB) {
ListNode *s1 = headA;
ListNode *s2 = headB;
while(s1 != s2){
if (s1)
s1 = s1 -> next;
else{
s1 = headB;
}
if (s2)
s2 = s2 -> next;
else{
s2 = headA;
}
}
return s1 ;
}
};