首页 > 其他分享 >leetcode160相交链表

leetcode160相交链表

时间:2024-06-07 11:02:21浏览次数:15  
标签:ListNode 相交 next 链表 curB headB curA leetcode160

本文主要讲解相交链表的要点与细节

c++及java代码如下,末尾

1.两个链表相交的条件是,两个节点的指针相同,而不是元素值相同,即

if(a==b) return a;

 

2.·既然要找到相交的点,那么相交之后,两个链表就完全一样了(后续长度和数值),那么我们就要不断同步更新headA和headB的临时指针,直到满足相交条件。

a=a->next;
b=b->next;

 

3.但是由于两个链表的长度不一致,不能一上来就同步更新,他们原本存在长度差,导致相交点是不对齐的。所以我们需要先移动较长链表的临时指针,让他们尾部对齐,再开始同步更新。


4.小细节:由于不知道具体测试例中,两个链哪个是长的,所以要找一下长的。可以把长的交换给a链,省去后续分情况讨论


c++代码如下

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode* curA = headA;
        ListNode* curB = headB;
        int lenA = 0, lenB = 0;
        while (curA != NULL) { // 求链表A的长度
            lenA++;
            curA = curA->next;
        }
        while (curB != NULL) { // 求链表B的长度
            lenB++;
            curB = curB->next;
        }
        curA = headA;
        curB = headB;
        // 让curA为最长链表的头,lenA为其长度
        if (lenB > lenA) {
            swap (lenA, lenB);
            swap (curA, curB);
        }
        // 求长度差
        int gap = lenA - lenB;
        // 让curA和curB在同一起点上(末尾位置对齐)
        while (gap--) {
            curA = curA->next;
        }
        // 遍历curA 和 curB,遇到相同则直接返回
        while (curA != NULL) {
            if (curA == curB) {
                return curA;
            }
            curA = curA->next;
            curB = curB->next;
        }
        return NULL;
    }
};

java代码如下

class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if (headA == null || headB == null) return null;
        ListNode a = headA;
        ListNode b = headB;
        int a_n = 0;
        int b_n = 0;
        //计算a链长度
        while (a != null) {
            a_n++;
            a = a.next;
        }
        //计算b链长度
        while (b != null) {
            b_n++;
            b = b.next;
        }

        a = headA;
        b = headB;

        //如果a是短链,那么把b交换给a
        if (a_n < b_n) {
            //1. swap (lenA, lenB);
            int tmpLen = a_n;
            a_n = b_n;
            b_n = tmpLen;
            //2. swap (curA, curB);
            ListNode tmpNode = a;
            a = b;
            b = tmpNode;
        }

        //长度差
        int diff = a_n - b_n;

        //移动a到对应位置
        while (diff != 0 && a != null) {
            a = a.next;
            diff--;
        }
        //判断是否相交
        while (a != null) {
            if (a == b) return a;
            a = a.next;
            b = b.next;
        }
        return null;
    }
}

标签:ListNode,相交,next,链表,curB,headB,curA,leetcode160
From: https://blog.csdn.net/lxw6666666666/article/details/139520967

相关文章

  • 【C++进阶】深入STL之list:高效双向链表的使用技巧
    ......
  • 代码随想录算法训练营 第三天 链表 Leetcode203 移除链表元素 Leetcode707 设计链表 L
    Leetcode203移除链表元素 题目链接注意为了使后续节点方式统一 要人为设置链表头节点链表的处理一定要明白如何找前置节点/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*L......
  • 6.6--链表
    链表的定义C++的定义链表节点方式,如下所示://单链表structListNode{intval;//节点上存储的元素ListNode*next;//指向下一个节点的指针ListNode(intx):val(x),next(NULL){}//节点的构造函数};不定义构造函数,C++默认生成一个构造函数,但是这......
  • C语言数据结构实现-单链表表基本操作
    链表插入元素同顺序表一样,向链表中增添元素,根据添加位置不同,可分为以下3种情况:插入到链表的头部(头节点之后),作为首元节点;插入到链表中间的某个位置;插入到链表的最末端,作为链表中最后一个数据元素;虽然新元素的插入位置不固定,但是链表插入元素的思想是固定的,只需做以下两步操......
  • 代码随想录算法训练营第四天 |节点交换、删除倒数n个节点、交叉链表、环形链表
    24题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/description/24题代码随想录讲解:https://programmercarl.com/0024.两两交换链表中的节点.html#思路19题链接:https://leetcode.cn/problems/remove-nth-node-from-end-of-list/19题代码随想录:https://programmerca......
  • 【数据结构与算法 经典例题】链表的回文结构(图文详解)
                  ......
  • 12- Redis 中的 链表 数据结构
    Redis的List对象的底层实现之一就是链表。C语言本身没有链表这个数据结构,所以Redis自己设计了一个链表数据结构。1.链表节点结构设计先来看看【链表节点】结构的样子:typedefstructlistNode{  //前置节点  structlistNode*prev;  //后置节点 ......
  • 数据结构单链表的前插法实现
    单链表的前插法实现可以通过以下步骤进行:创建一个新的节点,并将要插入的元素存储在新节点的数据域中。将新节点的指针域指向原链表的头节点。将原链表的头节点指向新节点。具体代码实现如下所示:classNode:def__init__(self,data):self.data=data......
  • 反转链表(递归和迭代两种实现)
    1#defineIOstd::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)2#definebug(x)cout<<#x<<"is"<<x<<endl;3#include<bits/stdc++.h>4usingnamespacestd;5typedeflonglongll;6structNode{7intx......
  • 链表-单链表实现
    关于链表要存储多个元素的时候,数组/列表是最为常用的数据结构,几乎每个编程语言都实现了数组或者列表.但这种结构的缺点是,通常数组大小是固定的,即便类似jsArray或者Python中的list,当我们从中间插入或者删除元素时成本很高.数组特点是:访问快(有索引),中......