题目
代码(首刷看解析)
脑子抽了,这题咋会没做出来。
走到尽头见不到你,于是走过你来时的路,等到相遇时才发现,你也走过我来时的路。
若相交,链表A: a+c, 链表B : b+c. a+c+b+c = b+c+a+c 。则会在公共处c起点相遇。若不相交,a+b = b+a 。因此相遇处是NULL
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
auto a = headA;
auto b = headB;
while(a != b) {
if(a == b) // 提前结束
return a;
if(!a)
a = headB;
else
a = a->next;
if(!b)
b = headA;
else
b = b->next;
}
return a;
}
};
代码(8.9 二刷自解)
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
auto p1 = pHead1, p2 = pHead2;
if(!p1 || !p2)
return nullptr;
while(p1 != p2) {
if(!p1) p1 = pHead2;
if(!p2) p2 = pHead1;
if(p1 == p2)
return p1;
p1 = p1->next;
p2 = p2->next;
}
return p1;
}
};
func getIntersectionNode(headA, headB *ListNode) *ListNode {
p1, p2 := headA, headB
for p1 != p2 {
if p1 != nil {
p1 = p1.Next
} else {
p1 = headB
}
if p2 != nil {
p2 = p2.Next
} else {
p2 = headA
}
}
return p1
}
代码(9.7 三刷自解)
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
auto a = headA, b = headB;
while(a != b) {
a = a->next;
b = b->next;
if(a == b)
return a;
if(!a) a = headB;
if(!b) b = headA;
}
return a;
}
};