给你2个链表,需要找到这2个链表的重合点的起点,从起点之后所有的点都一样了。这里题目要求时间
复杂度o(n),空间复杂度o(1),就说明不需要额外的空间,只需要遍历就能做出来,关键是思路的问题。
然后就以这个o(n)和o(1)为前提进行思考,首先想到的就是长度,重叠之后的元素都一样了,遍历到
最后一个肯定是一样的,否则就不重叠。然后是怎么找这个重叠的点,然后也好像只能从长度下手了,
因为后面的长度都一样,那前面的长度的差距就是总长度的差距,然后就有了思路了。
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(headA == NULL || headB == NULL)return NULL;
ListNode *headA_t = headA;
ListNode *headB_t = headB;
int lenA = 0;
int lenB = 0;
while(headA_t != NULL)
{
headA_t = headA_t->next;
lenA++;
}
while(headB_t != NULL)
{
headB_t = headB_t->next;
lenB++;
}
if(headA_t != headB_t)
{
return NULL;
}
if(lenA <= lenB)
{
while(lenA < lenB)
{
headB = headB->next;
lenA++;
}
}else
{
while(lenB < lenA)
{
headA = headA->next;
lenB++;
}
}
while(headA != headB)
{
headA = headA->next;
headB = headB->next;
}
return headA;
}
唉,老写算法没意思,过几天写个渗透的文章,看看有没有有趣点的网站可以弄弄。
2015/5/9 by 梅开二度