题目:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
leetcode链接
思路:得到两个链表总长度,并计算它们的差值diff,利用差值让两个链表尾端对齐,即移动长链表的指针,共移动diff步。对齐之后可以同时移动两个链表的指针,两个指针若不相等,则继续移动指针,否则相等并返回指针。
代码:
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution { //链表相交
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* curA = headA;
ListNode* curB = headB;
int lenA = 0, lenB = 0, diff;
while (curA != NULL) {
lenA++;
curA = curA->next;
}
while (curB != NULL) {
lenB++;
curB = curB->next;
}
diff = abs(lenA - lenB);
curA = headA;
curB = headB;
if (lenA > lenB) {
while (diff--) {
curA = curA->next;
}
}
else {
while (diff--) {
curB = curB->next;
}
}
while (curA != curB) {
curA = curA->next;
curB = curB->next;
}
return curA;
}
};