【力扣LeetCode】相交链表

题目:

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
在这里插入图片描述

题目分析:

解决这道题,我们的常规思路就是暴力求解,A链表每个节点依次去跟B链表的所有节点比较,如果有相同就是交点,如果没有就是不相交。但是其实在此基础上还是有优化思路的:可以分别求出A和B的长度,lenA和lenB,让长的链表先走|lenA-lenB|,再同时走找交点。
在这里插入图片描述

代码实现:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    
    
    struct ListNode* curA = headA;
    struct ListNode* curB = headB;
    int lenB = 0,lenA = 0;
    while(curA)
    {
    
    
        lenA++;
        curA = curA->next;
    }
    while(curB)
    {
    
    
        lenB++;
        curB = curB->next;
    }
    struct ListNode* longList = headA;
    struct ListNode* shortList = headB;
    if(lenB>lenA)
    {
    
    
        longList = headB;
        shortList = headA;
    }
    //让长的先走差距步
    int gap = abs(lenA-lenB);
    while(gap--)
    {
    
    
        longList = longList->next;
    }
    //同时走,找交点
    while(longList && shortList)
    {
    
    
        if(longList == shortList)
        {
    
    
            return longList;
        }
        longList = longList->next;
        shortList = shortList->next;
    }
    //不相交
    return NULL;
}

猜你喜欢

转载自blog.csdn.net/qq_46994783/article/details/120287799