
📝个人主页:@Sherry的成长之路
🏠学习社区:Sherry的成长之路(个人社区)
📖专栏链接:数据结构
🎯长路漫漫浩浩,万事皆有期待
文章目录
上一篇链表OJ题链接:【链表OJ题(七)】链表的回文结构
链接:160. 相交链表
描述:
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
图示两个链表在节点 c1 开始相交:

题目数据 保证 整个链式结构中不存在环。
注意函数返回结果后,链表必须 保持其原始结构 。
自定义评测:
评测系统 的输入如下(你设计的程序 不适用 此输入):
intersectVal - 相交的起始节点的值。如果不存在相交节点,这一值为 0
listA - 第一个链表
listB - 第二个链表
skipA - 在 listA 中(从头节点开始)跳到交叉节点的节点数
skipB - 在 listB 中(从头节点开始)跳到交叉节点的节点数
评测系统将根据这些输入创建链式数据结构,并将两个头节点 headA 和 headB 传递给你的程序。如果程序能够正确返回相交节点,那么你的解决方案将被 视作正确答案 。
示例1:

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3
输出:Intersected at ‘8’
解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。
在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
— 请注意相交节点的值不为 1,因为在链表 A 和链表 B 之中值为 1 的节点 (A 中第二个节点和 B 中第三个节点) 是不同的节点。换句话说,它们在内存中指向两个不同的位置,而链表 A 和链表 B 中值为 8 的节点 (A 中第三个节点,B 中第四个节点) 在内存中指向相同的位置。
示例2:

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

输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
输出:null
解释:从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。
由于这两个链表不相交,所以 intersectVal 必须为 0,而 skipA 和 skipB 可以是任意值。
这两个链表不相交,因此返回 null 。
提示:
listA 中节点数目为 m
listB 中节点数目为 n
1 <= m, n <= 3 * 10^4
1 <= Node.val <= 10^5
0 <= skipA <= m
0 <= skipB <= n
如果 listA 和 listB 没有交点,intersectVal 为 0
如果 listA 和 listB 有交点,intersectVal == listA[skipA] == listB[skipB]
取其中一条链表,让它的所有节点和另一条链表的所有元素比较。判断是否有交点,有则返回该节点;链表遍历完没有交点的话,返回空指针。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB)
{
struct ListNode *curA=headA;
while(curA)
{
struct ListNode *ccurA=curA;
struct ListNode *curB=headB;
while(curB)
{
if(ccurA==curB)
{
return ccurA;
}
else
{
curB=curB->next;
}
}
curA=curA->next;
}
return NULL;
}

但是时间复杂度为(N^2或M*N),能不能做出一些优化?
首先,我们要明确的一点是,只要两条链表 有交点 ,那么这两条链表的 尾结点 就是相等的。因为单链表中存储的一部分是数据,一部分是下一个节点的地址,一个节点中只有一个 next ,所以以后链表走的都是一条路。
所以如果两个链表相交,就说明它们的 尾结点肯定相同,那么遍历两条链表,比较它们的尾。然后算出两条链表的长度,让长的链表走差值步(gap)。
那么让长链表先走差值步,走到和短链表一样长,然后一起走,就能找到交点了。找到交点后返回长链表、短链表节点中的任意一个。

代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB)
{
struct ListNode* tailA = headA;
struct ListNode* tailB = headB;
int lenA = 1, lenB = 1;
// 这里 lenA 和 lenB 初始值其实关系不大
// 主要是算它们的差值,所以即使 lenA 和 lenB初始化为 0 也能跑过
// 但是由于是遍历到尾,所以 lenA 和 B 初始化为1是真正算出链表长度的
while (tailA->next)
{
++lenA;
tailA = tailA->next;
}
while (tailB->next)
{
tailB = tailB->next;
++lenB;
}
if (tailA != tailB)
{
return NULL;
}
struct ListNode *shortList=headB,*longList=headA;
if(lenA<lenB)
{
longList=headB;
shortList=headA;
}
/* struct ListNode* longList = lenA > lenB ? headA : headB;
// 这里需要注意一下,两次三目表达式的条件最好一样
// 否则链表的值相同时,可能会选取同一个链表
// 导致结果错误,已踩坑
struct ListNode* shortList = lenA > lenB ? headB : headA;
*/
int gap = abs(lenA - lenB);// 求差值
while (gap--)
{
longList = longList->next;
}
while (longList != shortList)
{
longList = longList->next;
shortList = shortList->next;
}
return longList;
}

今天我们分析并完成相交链表这道链表OJ题目,也学习和了解了一个新的思路–长链表先走差值步,走到和短链表一样长,然后一起走,就能找到交点,在之后的题目中将再次出现它的使用。希望我的文章和讲解能对大家的学习提供一些帮助。
当然,本文仍有许多不足之处,欢迎各位小伙伴们随时私信交流、批评指正!我们下期见~

前文,我们实现了认识了链表这一结构,并实现了无头单向非循环链表,接下来我们实现另一种常用的链表结构,带头双向循环链表。如有仍不了解单向链表的,请看这一篇文章(7条消息)【数据结构和算法】认识线性表中的链表,并实现单向链表_小王学代码的博客-CSDN博客目录前言一、带头双向循环链表是什么?二、实现带头双向循环链表1.结构体和要实现函数2.初始化和打印链表3.头插和尾插4.头删和尾删5.查找和返回结点个数6.在pos位置之前插入结点7.删除指定pos结点8.摧毁链表三、完整代码1.DSLinkList.h2.DSLinkList.c3.test.c总结前言带头双向循环链表,是链表中最为复杂的一种结
我刚刚第一次从GitHub克隆了一个存储库。我去我的本地机器上检查了它,所以在我的mac上的本地存储库中我运行了以下命令bin/rails服务器我收到以下错误:无法在任何来源中找到activesupport-5.0.0.1运行bundleinstall以安装缺少的gem。然后我按照建议运行了bundleinstall命令,但是它给了我以下错误安装oj(2.12.14)时出错,Bundler无法继续。确保geminstalloj-v'2.12.14'在捆绑之前成功。所以我按照建议运行了:geminstalloj-v'2.12.14'然后我收到一条非常长的消息,其中包含警告和错误(见下文)
我正在尝试用ruby在Gosu中编写hitboxes,并想检查2个范围是否满足(范围是坐标)我希望它简单地给出true或false我调查了一下,找到了range.cover?代码,但是在测试后这表明它只检查一个范围是否完全适合另一个范围,而不检查它们是否仅部分连接。#bothspritesarearrays,withthefollowingstructure#[image_data,sprite_x,sprite_y]#image_data.widthwouldreturnhowwidetheimageis#Thexandyisthetopleftofthespritedefhit
我在网上查了几个Ruby教程,他们似乎什么都用数组。那么如何在Ruby中实现以下数据结构呢?堆栈队列链表map组 最佳答案 (从评论中移出)好吧,通过限制堆栈或队列方法(push、pop、shift、unshift),数组可以是堆栈或队列。使用push/pop提供LIFO(后进先出)行为(堆栈),而使用push/shift或unshift/pop提供FIFO行为(队列)。map是hashes,和一个Set类已经存在。您可以使用类实现链表,但数组将使用标准数组方法提供类似于链表的行为。 关
我是JS的新手,组织数据的概念让我有些困惑,我试图从特定的数组格式中获取数据(因为这是我必须使用的格式)并将其输出为另一种特定的JSON格式。这是给D3sankey模块传递数据https://github.com/d3/d3-plugins/blob/master/sankey/sankey.js我不知道如何将节点的索引添加到链接中,而不是名称。真的,我完全迷失了它!我在这里做了一个fiddle:https://jsfiddle.net/adamdavi3s/kw3jtzx4/下面是所需数据和输出的示例vardata=[{"source":"Agricultural'waste'","
文章目录1.题目描述2.解题思路方法1:方法2:1.题目描述题目链接:力扣21,合并两个有序链表将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。2.解题思路方法1:首先我们能够想到的就是遍历一遍数组,判断两个结点的大小,将数值小的结点放在前面,数值大的不断尾插在后面。是不是听着挺简单的?具体实现:我们可以创建两个空指针,head用来存放链表的头结点,tail用来遍历两条链表,将两条链表链接起来。当某个链表为空时,我们可以直接返回另一条链表当两个链表都不为空时,我们可以不断比较两条链表的大小,当head和tail为空时,我们将较小的结点同时赋给head
所以我在JS中玩弄链表并提出了以下问题:比方说,我们有一个数组和一个链表,它们都有5000个元素。我们想在索引10处插入新元素。数组方式非常简单。我们在给定索引处插入新元素,并将其余元素向前移动一个索引。所以我尝试用链表来做这件事,并以下面的方式结束它:从NicholasZakas获取链表的实现并添加附加方法addOnPosition(data,index)。最后是代码:functionLinkedList(){this._head=null;this._length=0;}LinkedList.prototype={constructor:LinkedList,add:functio
我之前将此问题发布为jquery/javascript:arrays-jquery/javascript:arrays.但是由于我是一个完全的初学者,所以我提出了错误的问题并且也不理解答案....:(在未能实现给定的解决方案后,我又环顾四周,发现我需要比较6个可能的选择数组并将它们相交以最终仅显示重叠的值。因此,希望这是一个更清晰的表述:我有6个问题/6组单选按钮供回答。每个答案都有多个值(它们可以在1到38个项目的范围内显示在最终的“建议”中)。我正在收集数组中选中的radio的值。我得到6个数组。我如何将6个数组相交以获得一个仅包含来自所有6个选择的相交值的最终数组?我如何将这个最
这个问题在这里已经有了答案:Simplestcodeforarrayintersectioninjavascript(40个答案)FindingmatchesbetweenmultipleJavaScriptArrays(13个答案)关闭9年前。是否存在JS或jQuery函数来交叉2个数组,例如:vararray1=[1,2,3,4,5];vararray2=[2,4,8,9,0];varresult=someFun(array1,array2);//result=[2,4];当然我可以手动完成,但也许存在更短的方法。
我陷入了JavaScript的问题中。我有两个数组,我想检查它们是否在某些元素上相交,然后删除这些元素并返回没有相交元素的新数组。例子:ArrayA([0]=>0[1]=>1)ArrayB([0]=>2[1]=>1)我想检查它们并返回:Arrayresult([0]=>0[1]=>2)我如何在JavaScript中执行此操作? 最佳答案 检查图书馆underscore.js.假设你有两个数组,vara=[1,2];varb=[2,3];先找到工会。varall=_.union(a,b);然后找到交点。varcommon=_.inte