相交链表

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    if(headA == NULL || headB == NULL)
        return NULL;
    
    struct ListNode *temp1 = headA,*temp2 = headB;
    int lena = 0,lenb = 0;
    struct ListNode *p = headA; 
    while(p)                //计算出 A 的长度 
    {
        p = p->next;
        lena++;
    }
    
    p = headB;
    while(p)              //计算出 B 的长度 
    {
        p = p->next;
        lenb++;
    }
    
    if(lenb>lena)              //让较长的结点先走 
    {
        int i = 0;
        while(i<lenb-lena)
        {
            i++;
            headB = headB->next;   
        }
           
    }
    else
    {
        int i = 0;
        while(i<lena-lenb)
        {
            i++;
            headA = headA->next;
        }
            
    }
    
    while(headA != headB)           //找相汇的结点 
    {
        headA = headA->next;
        headB = headB->next;
    }
    struct ListNode *result = headA;
    headA = temp1;
    headB = temp2;
    
    return result;
}


//思路:先计算出表 A 和 表 B 的长度差值,这样就可以知道在相同的结点之前,两表相差多少结点,让较长的表先走过相差结点的长度,然后两表
//再同时开始遍历,当指向的结点相同时,就是相汇的结点 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值