【初阶数据结构题目】11.相交链表

相交链表

点击链接做题

思路:

  1. 如何判断链表是否相交
  2. 找相交链表的起始节点
  1. 遍历两个链表,若尾结点相同,则链表一定相交。
  2. 两个链表节点个数相同:往后遍历,找到相交的位置
  3. 两个链表节点个数不同:
    1. 找两个链表的节点数差值
    2. 让长链表先走差值步
    3. 两个链表开始遍历,比较是否为同一个节点

代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode ListNode;
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    ListNode* l1 = headA;
    ListNode* l2 = headB;
    int sizeA = 0, sizeB = 0;
    //计算链表长度,保存在sizeA,sizeB里面
    while(l1){
        sizeA++;
        l1 = l1->next;
    }
    while(l2){
        sizeB++;
        l2 = l2->next;
    }
    //计算链表差值(绝对值)
    int gap = abs(sizeA - sizeB);
    //让长链表先走gap步
    ListNode* longList = headA;
    ListNode* shortList = headB;
    if(sizeA < sizeB){//说明sizeB链表更长一些,否则就不交换
        longList = headB;
        shortList = headA;
    }
    while(gap--){
        longList = longList->next;
    }
    //此时longlist指针和shortlist指针在同一起跑线
    //链表相交,链表不相交
    while(longList && shortList){
        if(longList == shortList){
            //链表相交
            return longList;
        }
        //继续往后走
        longList = longList->next;
        shortList = shortList->next;
    }
    //链表不相交
    return NULL;
}
  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值