这个题目分为两问,第一问是这两个链表是否相交,第二问是如果相交,返回相交的起始节点。
首先是第一问,如何判断相交?其实很简单,只要将A链表和B链表各自走到自己的尾节点,判断两个链表的尾节点是否一致,就可以判断出两个链表是否相交。
那该如何找到相交的起始节点呢?当我们判断出这两个链表县相交时,只要让长的链表先走比短链表长的部分,然后长短链表一起走,直到两链表相等,再任意返回其中一个。
代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
struct ListNode*ptailA=headA;
struct ListNode*ptailB=headB;
int lenA=0;//求A链表的长度
int lenB=0;//求B链表长度
while(ptailA)
{
lenA++;
ptailA=ptailA->next;
}
while(ptailB)
{
lenB++;
ptailB=ptailB->next;
}
if(ptailA!=ptailB)
return NULL;
int gap=lenA-lenB;
if(lenA-lenB<0)
gap=gap*(-1);
struct ListNode*longlist=headA;
struct ListNode*shortlist=headB;
if(lenA<lenB)
{
longlist=headB;
shortlist=headA;
}
while(gap--)
longlist=longlist->next;
while(longlist!=shortlist)
{
longlist=longlist->next;
shortlist=shortlist->next;
}
return longlist;
}