160. Intersection of Two Linked Lists
解析
solution1:
我觉得hash是最简单的吧。直接遍历一遍链表,把pointer存在vector里,再遍历另一个链表,看指针是否在vector里出现过。
solution2:
一起遍历两个链表。这样就能得到两个链表长度的差值。再利用这个差值,遍历长一点的链表,使得长一点的链表比短一点的链表多走一段距离。这样就能保证两个链表肯定能同时遇到交叉(如果有点化)。
class Solution {
public:
ListNode * getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* pointer1 = headA;
ListNode* pointer2 = headB;
while (pointer1 != NULL && pointer2 != NULL) {
pointer1 = pointer1->next;
pointer2 = pointer2->next;
}
ListNode* walk1 = headA;
ListNode* walk2 = headB;
if (pointer1 != NULL) {
while (pointer1->next != NULL) {
pointer1 = pointer1->next;
walk1 = walk1->next;
}
walk1 = walk1->next;
}
else if (pointer2 != NULL) {
while (pointer2->next != NULL) {
pointer2 = pointer2->next;
walk2 = walk2->next;
}
walk2 = walk2->next;
}
while (walk1 != NULL && walk2 != NULL) {
if (walk1 == walk2)
return walk1;
walk1 = walk1->next;
walk2 = walk2->next;
}
return NULL;
}
};
Simple-C++-Solution-(5 lines)这个同学用的也是两指针法,但是代码写的太漂亮了。学习了