题目描述
方法一:暴力查找,时间复杂度为O(m+n)
外层循环遍历链表A,内层循环遍历链表B,依次寻找节点相同的地址,没有则返回NULL
Note
内层循环结束后curB 要重新指向链表B的头节点
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB)
{
struct ListNode* curA = headA;
struct ListNode* curB = headB;
while(curA)
{
while(curB)
{
if(curA == curB)
{
return curA;
}
else
{
curB = curB->next;
}
}
curB = headB;
curA = curA->next;
}
return NULL;
}
测试相交链表的小方法 :
先构造一个链表A,再使链表B指向链表A的某个节点,则可以构造一个相交链表
int main()
{
struct ListNode* headA = ListCreat();
struct ListNode* headB = headA->next;
ListPrint(headA);
ListPrint(headB);
struct ListNode* ret = getIntersectionNode(headA, headB);
ListPrint(ret);
return 0;
}
方法二:比较两个链表的尾节点的地址,相同则为相交链表
返回值:求出两个链表的长度lenA和lenB,较长链表先走差距步,然后同时走,第一个相等的节点即为相交点
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
struct ListNode* curA = headA;
struct ListNode* curB = headB;
int lenA = 0;
int lenB = 0;
//统计长度
while (curA)
{
lenA++;
curA = curA->next;
}
while (curB)
{
lenB++;
curB = curB->next;
}
struct ListNode* longList = headA, *shortList = headB;
if(lenA < lenB)
{
longList = headB;
shortList = headA;
}
int gap = abs(lenA-lenB);
//长链表先走差距步
while (gap--)
{
longList = longList->next;
}
//同时走
while(longList != shortList)
{
longList = longList->next;
shortList = shortList->next;
}
return longList;
}
当两个链表都为空链表时,上述代码中所有循环都不进入,且longList = headA;shortList = headB,最后返回longList仍然为空
当有一个空链表时,longList为非空链表,shortList为空链表,差距为非空链表的长度,非空链表走差距步后指向空,最后一个while循环不进入,返回longList仍然为空