题目要求:给定两个(单向)链表,判定它们是否相交并返回交点。请注意相交的定义基于节点的引用,而不是基于节点的值。换句话说,如果一个链表的第k个节点与另一个链表的第j个节点是同一节点(引用完全相同),则这两个链表相交。
分析:可以使用双指针,因为遍历的路径是相等的,如果有相交的话,会相遇!
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(headA == NULL || headB == NULL)
return NULL;
ListNode* nodeA = headA;
ListNode* nodeB = headB;
while(nodeA != nodeB) {
nodeA = ((nodeA == NULL) ? headB : nodeA->next);
nodeB = ((nodeB == NULL) ? headA : nodeB->next);
}
return nodeA;
}
};
方法2:我们可以将连个链表截成长度相等的链表,这样一起遍历就能找到相交的结点!
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(headA == NULL || headB == NULL)
return NULL;
int lenA = getListLength(headA);
int lenB = getListLength(headB);
int dif = lenA - lenB;
if(dif < 0) {
headB = cutList(headB,-dif);
}
else if(dif > 0) {
headA = cutList(headA,dif);
}
ListNode* interNode = NULL;
while(headA != headB) {
headA = headA->next;
headB = headB->next;
}
return headA;
}
private:
ListNode* cutList(ListNode* head,int len) {
while(len) {
head = head->next;
len--;
}
return head;
}
int getListLength(ListNode* head) {
int result = 0;
while(head != NULL) {
head = head->next;
result++;
}
return result;
}
};