Definition for singly-linked list.
struct ListNode {
int val;
struct ListNode *next;
};
typedef struct ListNode ListNode;
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
ListNode* curA=headA,*curB=headB;
int lenA=0;
int lenB=0;
while(curA->next)
{
curA=curA->next;
lenA++;
}
while(curB->next)
{
curB=curB->next;
lenB++;
}
if(curA!=curB)
{
return NULL;
}
int gap=abs(lenA-lenB);
ListNode* longList=headA,*shortList=headB;
if(lenB>lenA)
{
longList=headB;
shortList=headA;
}
while(gap--)
{
longList=longList->next;
}
while(longList!=shortList)
{
longList=longList->next;
shortList=shortList->next;
}
return shortList;
}
首先要先判断这两个链表是否相交。两个链表从头遍历到尾,如果两个尾指针不相等就是不相交就返回NULL。
求两个链表的长度,并求两个链表的长度差。让lenA-lenB因为不知道a长还是b长所以用abs求绝对值。要是按普通情况就要分情况a长一种情况b长一种情况。这种太麻烦,所以让A链表为长链表让B链表为短链标。如果B的长度>A的长度就让B链表为长链表A链表为短链表。
用while循环长度差gap次,让长链表和短链表一样长。然后遍历,如果长链表和短链表相同就停,并且返回任意一个。