思路:这道题咋一看觉得挺容易,就是遍历两个链表,然后若两个指针值相同(指向同一节点),那么改结点就是相交点!但是,题目给出的两个链表长度是不一致的,所以我们得把不一致的链表转化成一致的链表;
struct ListNode
{
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
//假定链表A长于链表B,lenMin为链表B的长度
ListNode *Check(ListNode *headA, int lenA, ListNode *headB, int lenB)
{
int dis = lenA - lenB;
//让长链表先走,走到长度与短链表一致;
while (headA != NULL && dis--)
{
headA = headA->next;
}
//然后两个链表同时遍历,如果指针值相同,说明该指针指向的结点就是插入节点!
while (headA != NULL && headB != NULL)
{
if (headA == headB)
{
ListNode *result = headB;
return result;
}
headA = headA->next;
headB = headB->next;
}
return NULL;
}
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB)
{
//两个链表都遍历一次,找到短链表,从而确定长链表改从何处开始判断
ListNode *head1 = headA;
ListNode *head2 = headB;
int lenA = 0;
int lenB = 0;
while (head1 != NULL)
{
lenA++;
head1 = head1->next;
}
while (head2 != NULL)
{
lenB++;
head2 = head2->next;
}
if (lenA > lenB)
{
return Check(headA, lenA, headB, lenB);
}
else
{
return Check(headB, lenB, headA, lenA);
}
}