【LeetCode刷题日记】160:相交链表
个人主页北极的代码欢迎来访作者简介java后端学习者❄️个人专栏苍穹外卖日记SSM框架深入JavaWeb✨命运的结局尽可永在不屈的挑战却不可须臾或缺题目背景LeetCode160给你两个单链表的头节点 headA 和 headB 请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点返回 null 。图示两个链表在节点 c1 开始相交题目数据 保证 整个链式结构中不存在环。注意函数返回结果后链表必须 保持其原始结构 。示例 1示例 2示例 3题目答案(版本一)先行移动长链表实现同步移动 public 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) { //1. swap (lenA, lenB); int tmpLen lenA; lenA lenB; lenB tmpLen; //2. swap (curA, curB); ListNode tmpNode curA; curA curB; curB tmpNode; } // 求长度差 int gap lenA - lenB; // 让curA和curB在同一起点上末尾位置对齐 while (gap-- 0) { curA curA.next; } // 遍历curA 和 curB遇到相同则直接返回 while (curA ! null) { if (curA curB) { return curA; } curA curA.next; curB curB.next; } return null; } }题目解析在拿到这题目的时候我们需要区分的第一个概念就是我们要找的相交的节点需要比较的是地址值而不仅仅是节点的val值简单的来说如果两个节点的地址值相等就已经保证了节点val值相等同时还能保证相交节点之后的节点都是一样的因为一个节点只能指向一个next不存在在节点之后分叉的情况前提是相交链表。因为这些的前提就是两个链表有相交节点有相交节点的前提就是两个节点的地址值相等两个节点的地址值相等就已经保证了在第一个相交节点之后两个链表的之后节点也是完全相等的也就是共用一条链的感觉。如图相交节点是22后面的节点是两条链都有的因此2节点处的地址值才相等。所以仅仅比较节点的val值完全是片面的要找到地址值相等的节点才可以。因此我们这题的主要思路就是先找到相交节点如果是一长一短的链表我们先让长链表的指针移动两个链表的长度差的值让两个链表从同一起点开始因为我们要找的相交节点要求可以说是很苛刻相交节点之后的长度val值等等都要完全一样不然就不是相交节点。所以我们还要记录两个链表的长度从而进行比较和计算长度差。同一起点之后我们就开始比较两个链表的指针去寻找相交节点如果不相同则同时向后移动继续比较这里强调是同时相同因为要保证相交节点之后两个链表的长度也是一样的因为已经是从同一起点开始移动比较了。如果没找到则两个链表不相交循环退出返回空指针。我们这里curAcurB比较的就是地址值仅仅比较val值太片面不能保证之后的节点是否相等这是本题的核心。易错点我们在题目中先定义ListNode curA curB的时候这是定义加初始化但是由于我们用这两个指针进行了循环计算长度此时指针位置已经移动到末尾了所以我们为了方便下面的使用又进行了操作 curAheadAcurBheadB这里是重置归位的作用。同时我们还要比较哪个链表的长度长哪个短需要进行条件判断比较麻烦我们在这里有一个操作直接进行硬性规定直接令curA为长链表的表头lenA为其长度。只需要进行一个判断如果BA直接进行交换即可需要定义一个 临时变量进行临时存储。结语如果对你有帮助请点赞关注收藏你的支持就是我最大的鼓励有疑问也可以在评论区发出来让我们一起进步