7、C++算法之代码随想录(链表)——链表相交

(1)问题

力扣——面试题 02.07. 链表相交 - 力扣(LeetCode)

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。

图示两个链表在节点 c1 开始相交

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构 。

示例 1:

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Intersected at '8'
解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。
在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
(2)思路

        找两个链表的相交节点,两个链表的长度不同,但如果两个链表相交,相交部分长度却是相同的。因此,可以将两个链表的头节点移动到相同的位置(找到长链表,移动长链表直到与短链表长度相同),然后同时往后移动,如果相交,两个节点的地址就相等,返回该节点即可。如果不相交,最后返回nullptr。

(3)解题流程

        1.计算两个链表的长度。封装为一个函数,输入头节点,返回长度。

        2.创建遍历的节点curA = headA,curB = headB;

        3.找到较长的链表,然后移动到与短链表相同的位置。

        4.同时移动两个节点,如果存在节点相同(这里是判断地址,不是判断它们存储的值和指针),直接返回该节点。

        5.循环节点,最后返回nullptr。

代码实现:

   int getlenght(ListNode* head)
    {
        if(head==nullptr) return 0;
         int size = 1;
        while(head->next!=nullptr)
        {
            head = head->next;
            size++;
        }
        return size;
    }

    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {

        ListNode* curA = headA;
        ListNode* curB = headB;
        int lengthA = getlenght(headA);
        int lengthB = getlenght(headB);

        if(lengthA>lengthB)
        {
            int n = lengthA-lengthB;
            while(n--)
            {
                curA = curA->next;
            }
        }
        else
        {
            int m = lengthB-lengthA;
            while(m--)
            {
                curB = curB->next;
            }
        }

        while(curA&&curB)
        {
            if(curA==curB)
            {
                return curA;
            }
            curA = curA->next;
            curB = curB->next;
        }
        return nullptr;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值