感觉今天的题有点难理解,不过好在后来搞懂了。老哥的思路确实不错,官方的解法有点像高中解题时的巧方法,好巧不巧,我比较平庸,所以...采用了一个我更能够理解的方法把。题干如下:
老哥估计是忘记录视频了,花了我好些时间理解,虽然是简单题,但我感觉没做过肯定不知道这个解法,大部分估计是哈希表做的,空间复杂度会变高。首先理解题意,找出相交的起始节点,从常规角度思考,既然相交那就不会是只交一个点,它会是一段。而如图例所示,A的屁股跟B的屁股并一起了,所以考虑尾对齐。代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode *curA = headA;
ListNode *curB = headB;
int lenA = 0, lenB = 0;
while(curA != NULL){
lenA++;
curA = curA -> next;
}
while(curB != NULL){
lenB++;
curB = curB -> next;
}
curA = headA;
curB = headB;
if(lenB > lenA){
swap(lenA, lenB);
swap(curA, curB);
}
int gap = lenA - lenB;
while(gap--){
curA = curA -> next;
}
while(curA != NULL){
if(curA == curB) return curA;
curA = curA -> next;
curB = curB -> next;
}
return NULL;
}
};
着重解释这两段,估计我过几天会忘掉,现在赶紧记下来:
if(lenB > lenA)
{
swap(lenA, lenB);
swap(curA, curB);
}
这么说或许更清晰:现在有一个长壳和一个短壳,长壳叫A短壳叫B,默认链表A比B长,A本该塞到长壳里,B本该塞到短壳里,现在B链比A长,需要进行“搬家”,将长度与指针交换后即可完成搬家。现在A壳里面塞了B链,B壳里面塞了A链。第一行swap了lenA与lenB,方便后面的gap计算,第二行swap了curA与curB保证curA永远指向更长的那个。