【leetcode】160.相交链表

题目描述 

【leetcode】160.相交链表_第1张图片

【leetcode】160.相交链表_第2张图片

【leetcode】160.相交链表_第3张图片

【leetcode】160.相交链表_第4张图片

方法一:暴力查找,时间复杂度为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,较长链表先走差距步,然后同时走,第一个相等的节点即为相交点

【leetcode】160.相交链表_第5张图片 参考代码如下:

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仍然为空

你可能感兴趣的:(实例,leetcode,链表,算法)