✨✨所属专栏:LeetCode刷题专栏✨✨
✨✨作者主页:嶔某✨✨
题目:
题解:
看到这个题目首先我们要排除链表逆置的想法,如图、因为c1节点只有一个next指针,逆置后不可能同时指向a2和b3节点。
其次有的的同学想到一个一个节点来比较值,首先这是错误的。
第一:AB两个链表的长度不一定相同,不能相比。
第二:比较节点中的值有一定的特殊情况,我们要比的时节点的地址。
常规解法:
先分别算出A、B两个链表的长度lenA,lenB,先让长的链表的头指针走|lenA - lenB|,然后再一起走,以longlist != shortlist为循环的终止条件
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB)
{
int lenA = 0;
int lenB = 0;
struct ListNode *cur1 = headA;
struct ListNode *cur2 = headB;
while(cur1->next)
{
lenA++;
cur1 = cur1->next;
}
while(cur2->next)
{
lenB++;
cur2 = cur2->next;
}
int Difference = abs(lenA - lenB);
struct ListNode *longlist = headA;
struct ListNode *shortlist = headB;
if(lenA < lenB)
{
longlist = headB;
shortlist = headA;
}
while(Difference--)
longlist = longlist->next;
while(longlist && shortlist)
{
if(longlist == shortlist)
return longlist;
longlist = longlist->next;
shortlist = shortlist->next;
}
return NULL;
}
大神解法:
让A链表从头遍历,当pA为空时,pA = headB;B链表从头遍历,当pB为空时,pB = headA。让每个链表都走完两个链表的路程,最后它们一定会在相交节点处相遇
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB)
{
if(headA == NULL || headB ==NULL)
return NULL;
struct ListNode *pA = headA;
struct ListNode *pB = headB;
while(pA != pB)
{
pA = pA == NULL?headB:pA->next;
pB = pB == NULL?headA:pB->next;
}
return pA;
}
本期博客到这里就结束了,如果有什么错误,欢迎指出,如果对你有帮助,请点个赞,谢谢!