leetcode-160 相交链表:传送门
我的思路
分别求出链表的长度numa和numb,如果链表相交,在相交节点及以后两个链表的长度是相等的,那么只要长的链表头节点先走 链表长度差 的距离,之后两个链表节点同时往后走,就一定能找到相交节点;如果链表不相交,链表的结点最后会指向空,返回空。
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* pa = headA;
ListNode* pb = headB;
int numa = 0;
int numb = 0;
//求链表长度
while(pa != nullptr){
numa++;
pa = pa->next;
}
while(pb != nullptr){
numb++;
pb = pb->next;
}
pa = headA;
pb = headB;
//长链表先走 |numa-numb| 的长度
if(numa > numb){
int dif = numa - numb;
while(dif > 0){
pa = pa->next;
dif--;
}
}
else{
int dif = numb - numa;
while(dif > 0){
pb = pb->next;
dif--;
}
}
//找相交节点
while(pa != nullptr && pb != nullptr && pa != pb){
pa = pa->next;
pb = pb->next;
}
return pa;
}
优化
参考派派大佬:传送门
你以为我开始写优化的算法了,其实我准备写爱情
分别用指针pa和pb指向两个链表的头节点,指针同时移动,当指针为空时指向另一条链表的头节点继续遍历,直到两指针相遇,有相交节点则在节点处相遇,不相交则在最后都指向nullptr(认为在nullptr处相遇)
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* pa = headA;
ListNode* pb = headB;
while(pa != pb){
if(pa != nullptr)
pa = pa->next;
else
pa = headB;
if(pb != nullptr)
pb = pb->next;
else
pb = headA;
}
return pa;
}
(与这种 爱情[bushi] 类似的题还有判断链表是否有环问题)