02.07. 链表相交

news/2025/2/23 8:59:39

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

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

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

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

方法1:朴素算法

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        //注意:这个题是节点相等,不是节点值相等。
		ListNode *curA = headA;
        ListNode *curB = headB;
        if(curA == NULL || curB == NULL) return NULL;
        //先要算出他们之间的长度
        int len1 = 0;
        while(curA){
            len1++;
            curA = curA->next;
            
        }
        int len2 = 0;
        while(curB){
            len2++;
            curB = curB->next;
            
        }
        //关键点,之前移动到末尾了,需要重新开始
        curA = headA;
        curB = headB;
        //长度不一样,让curA为最长链表的头,len1为其长度
        if(len1<len2){
            swap(len1,len2);
            swap(curA,curB);
        }
        int size = len1-len2;
        while(size--){
            curA = curA->next;
        }

        while(curA)
        {
            if(curB == curA){//这里要先比,在往下移动,不然忽略第一个
                return curA;
            }
            curA = curA->next;
            curB = curB->next;
        }

        return NULL;
    }
};

方法2:双指针

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        //双指针
        ListNode *curA = headA;
        ListNode *curB = headB;
        while(curA != curB)
        {
            //走完自己的路再走别人走过的路,看看是否能相遇
            curA = curA != NULL?curA->next:headB;//关键点是换头节点
            curB = curB != NULL?curB->next:headA;
        }

        return curA;
    }
};


http://www.niftyadmin.cn/n/1248274.html

相关文章

间隔删除链表结点

给你一个链表的头结点 head&#xff0c;每隔一个结点删除另一个结点&#xff08;要求保留头结点&#xff09;。 请返回最终链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4] 输出: [1,3] 解释&#xff1a; 蓝色结点为删除的结点 示例 2&#xff1a; 输入&a…

5915. 找出临界点之间的最小和最大距离

5915. 找出临界点之间的最小和最大距离 链表中的 临界点 定义为一个 局部极大值点 或 局部极小值点 。 如果当前节点的值 严格大于 前一个节点和后一个节点&#xff0c;那么这个节点就是一个 局部极大值点 。 如果当前节点的值 严格小于 前一个节点和后一个节点&#xff0c…

5914. 值相等的最小索引

5914. 值相等的最小索引 给你一个下标从 0 开始的整数数组 nums &#xff0c;返回 nums 中满足 i mod 10 nums[i] 的最小下标 i &#xff1b;如果不存在这样的下标&#xff0c;返回 -1 。 x mod y 表示 x 除以 y 的 余数 。 class Solution { public:int smallestEqual(vec…

反转偶数长度组的节点

2074.反转偶数长度组的节点 给你一个链表的头节点 head 。 链表中的节点 按顺序 划分成若干 非空 组&#xff0c;这些非空组的长度构成一个自然数序列&#xff08;1, 2, 3, 4, ...&#xff09;。一个组的 长度 就是组中分配到的节点数目。换句话说&#xff1a; 节点 1 分配给…

艺术装置?人造植物?机器人?办公室植物 OFFICE PLANT #1

[ OFFICE PLANT #1 ]一种模拟室内植物的 interactive sculpture时间&#xff1a;1998 年作者&#xff1a;Marc Bohlen & Michael MateasOFFICE PLANT #1 是一名电子邮件的评论员&#xff0c;它对⽤⼾收到的电⼦邮件中的社交和情感内容做出物理响应。技术上&#xff0c;监控…

元宇宙·跨学科·第二季 S2

据研究&#xff0c;预计在2030年&#xff0c;全球元宇宙市场规模将达到 1.5 万亿美元。各行各业有哪些元宇宙的机会呢&#xff1f;到底哪些才是有效的解决方案&#xff1f;S2我们将基于S1的基础上&#xff0c;搜集市面上的经典案例和典型问题进行研究讨论&#xff0c;为大家呈现…

给植物浇水

5201. 给植物浇水 难度中等0 你打算用一个水罐给花园里的 n 株植物浇水。植物排成一行&#xff0c;从左到右进行标记&#xff0c;编号从 0 到 n - 1 。其中&#xff0c;第 i 株植物的位置是 x i 。x -1 处有一条河&#xff0c;你可以在那里重新灌满你的水罐。 每一株植物都…

进入元宇宙的通道在哪里?#元宇宙基础设施

©The Great mental Models Vol.1. Farnam StreetiPhone 12 pro 用户可通过Clips APP使用AR功能。2021年4月&#xff0c;马斯克发推文称&#xff0c;一只猴子“正在用意念玩电子游戏”。脑机接口公司Neuralink在猴子的大脑中植入了微型电极&#xff0c;通过无线传输到电脑解…