给你两个单链表的头节点 headA
和 headB
,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null
。
解法一:如果两个链表有相交,那么从后面看一定是相同的,所以只需要把长的移动到和短的链表一样的长度开始遍历即可
class Solution {
public:
ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
ListNode* cur1 = headA;
ListNode* cur2 = headB;
int l1 = 0, l2 = 0;
// 求出两个链表长度
while (cur1 != NULL) {
l1++;
cur1 = cur1->next;
}
while (cur2 != NULL) {
l2++;
cur2 = cur2->next;
}
// 此时 cur1 cur2 都指向空,所以要把他们指向 head
cur1 = headA;
cur2 = headB;
// 把长的设置成1
if (l1 < l2) {
swap(l1, l2);
swap(cur1, cur2);
}
// 把长的移动到和短的一样的位置
int l = l1 - l2;
while (l--) {
cur1 = cur1->next;
}
// 从相等处开始遍历
while (cur1 != NULL) {
if (cur1 == cur2) {
return cur1;
}
cur1 = cur1->next;
cur2 = cur2->next;
}
return NULL;
}
};
解法二:太强了,暂时理解不了
class Solution {
public:
ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
ListNode* cur1 = headA;
ListNode* cur2 = headB;
while (cur1 != cur2) {
cur1 = cur1 != nullptr ? cur1->next : headB;
cur2 = cur2 != nullptr ? cur2->next : headA;
}
return cur1;
}
};