输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
题目链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists-lcci/
Write a program to find the node at which the intersection of two singly linked lists begins.
示例 1: 输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3 输出:Reference of the node with value = 8 输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
使用哈希表存储链表节点,先遍历链表headA,将headA的每个节点加入哈希表,再遍历链表headB,判断遍历节点是否在哈希表中:
因为链表一长一短,所以先让长的一方走到和短的一方开始的位置,然后用双指针同时进行遍历,出现第一个相同的节点时就返回对应指针
链表(Linked List)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。
最近听了左神的算法课,对一些常用数据结构以及算法改进的思路有了更深的理解,特此总结,不定期更新算法题目以及答案总结!笔者使用C++进行算法重现!虽然左神使用的是JAVA,但他自己也说了,算法与语言无关,但C++写出来的复杂度过不了,那么用其他的语言JAVA,Python也一定过不了!所以刷题还是尽量C++吧,算法基本用不了什么库函数,顶多几个数据结构,而C++的STL里面都包含。
在本题中,单链表可能有环,也可能无环。 给定两个 单链表的头节点head1和head2,这两个链表可能相交,也可能不相交。 请实现一个函数,如果两个链表相交,请返回相交的第一个节点; 如果不相交,返回null即可。 要求: 如果链表1的长度为N,链表2的长度为M,时间复杂度请达到 O(N+M),额外空间复杂度请达到O(1)
在上图中,这两个链表相交于结点5,要求判断两个链表是否相交,如果相交,找出相交处的结点。
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
注意: 如果两个链表没有交点,返回 null. 在返回结果后,两个链表仍须保持原有的结构。 可假定整个链表结构中没有循环。 程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
1.判断链表是否有环,返回第一个入环节点。 2.判断是否相交 3.判断相交节点是否相同
这题的解法有些独特,可能是我太久没接触几何相关的问题了,要是放在初中,应该还是能想出来。
有这样一个经典的算法题,说是一个单向链表,它内部可能存在环,也可能不存在,用怎样的方法,可以检测出,这个链表是否存在环。下图即是这个形成环的示意,如果单向链表的尾部,指向了链表中的一个节点,而不是指向空,那就构成环了。
输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3 输出:Reference of the node with value = 8 输入解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
https://leetcode.cn/problems/intersection-of-two-linked-lists/description/
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。 图示两个链表在节点 c1 开始相交:
我们可以如下递归地定义两个链表里的 merge 操作(忽略边界情况,比如空链表等):
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
周末参加完美世界校园招聘中就有一道判断单链表是否有环的编程题。 写一个C/C++函数,来判断一个单链表是否具有环,如果存在环,则给出环的入口点。 有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环。 现在需要解决的问题有以下两个: 如何判断一个链表是不是这类链表? 如果链表为存在环,如果找到环的入口点? 判断链表是否存在环,办法为: 设置两个指针(fast, slow),初始值都指向头,slow每次前进一步,fast每次前进二步,如果链表存在环,则
https://leetcode-cn.com/problems/intersection-of-two-linked-lists/
如果两个链表没有交点,返回 null. 在返回结果后,两个链表仍须保持原有的结构。 可假定整个链表结构中没有循环。 程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
链表节点定义如下 public class Node { public Integer value; public Node next; public Node() { } public Node(Integer value) { this.value = value; } public Node(Integer value, Node next) { this.value = value; thi
如上图所示如果两链表相交呈'X'型的话,相交节点的next就会指向两个节点,这并不符合单链表的定义。 那么在判断了相交链表后,如何找到相交节点呢?在我们找尾节点时,我们可以顺便计算两链表的长度,定义两链表指针slow,fast分别指向链表头节点,让指向长链表的指针先走两链表长度的差值,然后一起向后走,当slow == fast时就找到了相交节点。
总的来说,双指针技巧在解决单链表相关问题时非常实用,它能够高效地解决许多常见问题,包括合并、分解、寻找节点、判断是否存在环等等。而我们需要使用双指针解决的以上问题,则是先要学会以下问题的解题思路,一起看看。
7和4呢,2 、5 、3是不是都是它们两个的公共祖先啊,但是题目要求找最近的公共祖先,所以是2。 再看一种情况
最近刷了一些链表相关的题目,总结了下比较经典的题目。在leetcode中,官方给出的说明是malloc的内存不需要释放,所以代码中都没有free。但是在实际的编程中,我们要将申请的内存释放掉,同时把指针指向NULL,这是一种良好的习惯。
这个时候短链表和长链表继续向前走,当长链表的慢指针到达尾部的时候,快指针就会从长链表头部走n步,此时再将慢指针变为短链表头部,就能够使得长短链表开始的头部位置相同
【3.4 拓展问题】编写一个函数,给定一个链表的头指针,要求只遍历一次,将单链表中的元素顺序反转过来。
设「[第一个公共节点」为 node ,「链表 headA」的节点数量为 a ,「链表 headB」的节点数为b , 「两链表的公共尾部」的节点数量为 c ,则有:
这次的题比较少,题目的主题是链表,最值得注意的是快慢指针的用法和最后一题的Floyd判圈算法。
此题求两个链表的第一个公共节点。题目要求时间复杂度是O(n),空间复杂度是O(1) ,这里使用双指针进行求解。
链表是面试过程中经常被问到的,这里把剑指offer 和 LeetCode 中的相关题目做一个汇总,方便复习。
力扣题目链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists-lcci
方法2.c=-(a+b): 确定了a和b,那就可以想两数之和一样,在map中寻找-(a+b),减少一层循环,时间复杂度O(n^2),空间复杂度O(n)。
step 1: 使用两个指针指向两链表头,分别从头拨到尾,统计两个链表到终点的步数分别为 d1, d2。
给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。
一、160. 相交链表 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交 题目数据 保证 整个链式结构中不存在环。 注意,函数返回结果后,链表必须 保持其原始结构 。 自定义评测: 评测系统 的输入如下(你设计的程序 不适用 此输入): intersectVal - 相交的起始节点的值。如果不存在相交节点,这一值为 0 listA - 第一个链表 listB - 第二个链表 sk
判断一个单向链表是否有环。(指向表头结点的指针为head) 方法一: (1)用两个指针p1和p2分别指向表头结点,即p1=p2=head (2)p1和p2分别采用1和2作为步长遍历该链表。(注意,p2应该检查当前结点的下一个结点是否为NULL) (3)如果p1或者p2遇到了NULL,则证明该链表没有环;若p1和p2在某时刻指向同一结点,则说明该链表有环。 bool I***itsLoop(slist * head) { slist * slow = head , * fast = head; while
版权所有,转载请注明出处,谢谢! http://blog.csdn.net/walkinginthewind/article/details/7393134
【 题目】 在本题中, 单链表可能有环, 也可能无环。 给定两个单链表的头节点 head1和head2, 这两个链表可能相交, 也可能 不相交。 请实现一个函数, 如果两个链表相交, 请返回相交的第一个节点; 如果不相交, 返回null 即可。 要求: 如果链表1的长度为N, 链表2的长度为M, 时间复杂度请达到 O(N+M), 额外空间复杂度请达到O(1)
编写一个程序,找到两个单链表相交的起始节点。 《剑指Offer》同题:面试题52. 两个链表的第一个公共节点 《程序员面试金典》同题:面试题 02.07. 链表相交
领取专属 10元无门槛券
手把手带您无忧上云