160. 相交链表

思想:

这道题目其实思想上很简单,就是让两个链表保持在同一起跑线上,一起往后遍历,最终找到两者指向地址相同的结点,这就是公共结点。详情请看以下代码,分为三个步骤。

代码实现:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
     
    struct ListNode* Alen = headA;
    struct ListNode* Blen = headB;
    int la = 0;
    int lb = 0;

    //1、计算两个链表的长度
    while(Alen)
    {
     
        la++;
        Alen = Alen->next;
    }
    while(Blen)
    {
     
        lb++;
        Blen = Blen->next;
    }

    //2、比较两个链表的长度,将长的链表走两个链表长度的差值,保证两者在同一起跑线去向后遍历
    struct ListNode* longList = headA;
    struct ListNode* shortList = headB;
    if(la<lb)
    {
     
        longList = headB;
        shortList = headA;
    }
    int gap = abs(la-lb);
    while(gap--)
    {
     
        longList = longList->next;
    }

    //3、比较两个链表指向的地址是否相同,如相同,则为公共结点
    while(longList)
    {
     
    	//比较长链表与短链表指向的地址是否相同,相同则返回此时的结点
        if(longList == shortList)
        {
     
            return longList;
        }
        //不相同就继续向下一个结点遍历
        longList = longList->next;
        shortList = shortList->next;
    }

    return NULL;
}

你可能感兴趣的:(c语言,数据结构)