大概思路:链表如果相交的话,那么从相交的结点开始,两个链表对应的结点都指向同一个地方,就像题目说明的一样
即:如果A链表在c1处与B链表相交,那么A链表从c1结点到尾结点的距离,与B链表从c1结点到尾结点的距离相同。
因此,程序先判空,如果headA链表或headB链表有一个为空,那么一定不相交。
随后:
步骤一:声明两个指针指向两个链表,并将两个链表各遍历一次,以得到两个链表的长度num_A,num_B,将二者相减得到链表的长度差,即length。
步骤二:若length为正,说明headA链表长于headB链表,因此将taila指针后移,每后移一个结点,length都–,直至leng为0;反之,说明headA链表短于headB链表,因此将tailb指针后移,每后移一个结点,length都++,直至length为0。
步骤三:此时,若taila和tailb之间有相交结点,则taila和tailb后的链表剩余长度相同,因此只需进行判断,每判断一次就将两个指针后移一步,直至两个指针相同或其中一个为空。若循环结束后两个指针相同,则说明相交。否则(如出现其中一个指针为空的情况),这说明不相交。
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
if(headA==NULL||headB==NULL)
return NULL;
struct ListNode* taila=headA;
struct ListNode* tailb=headB;
int num_A,num_B,length;
for(num_A=1;taila->next!=NULL;num_A++){
taila=taila->next;
}
for(num_B=1;tailb->next!=NULL;num_B++){
tailb=tailb->next;
}
taila=headA;
tailb=headB;
length=num_A-num_B;
//以上为步骤一
if(length>0){
while(length!=0){
taila=taila->next;
length--;
}
}
else{
while(length!=0){
tailb=tailb->next;
length++;
}
}
//以上为步骤二,以下为步骤三
while((taila!=tailb)&&(taila->next!=NULL)&&(tailb->next!=NULL)){
taila=taila->next;
tailb=tailb->next;
}
if(taila==tailb)
return taila;
else
return NULL;
}