有哪些做任务的网站,建设施工合同,互联网广告优势,广告外链购买交易平台来源于「Krahets」的《图解算法数据结构》 https://leetcode.cn/leetbook/detail/illustration-of-algorithm/
本题与主站 160 题相同#xff1a;https://leetcode-cn.com/problems/intersection-of-two-linked-lists/
训练计划 V 某教练同时带教两位学员#xff0c;分别以…来源于「Krahets」的《图解算法数据结构》 https://leetcode.cn/leetbook/detail/illustration-of-algorithm/
本题与主站 160 题相同https://leetcode-cn.com/problems/intersection-of-two-linked-lists/
训练计划 V 某教练同时带教两位学员分别以链表 l1、l2 记录了两套核心肌群训练计划节点值为训练项目编号。两套计划仅有前半部分热身项目不同后续正式训练项目相同。请设计一个程序找出并返回第一个正式训练项目编号。如果两个链表不存在相交节点返回null 。 输入说明 intersectVal - 相交的起始节点的值。如果不存在相交节点这一值为 0 l1 - 第一个训练计划链表 l2 - 第二个训练计划链表 skip1 - 在 l1 中从头节点开始跳到交叉节点的节点数 skip2 - 在 l2 中从头节点开始跳到交叉节点的节点数 程序将根据这些输入创建链式数据结构并将两个头节点 head1 和 head2 传递给你的程序。如果程序能够正确返回相交节点那么你的解决方案将被视作正确答案 。 示例 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 个节点。 示例 2 输入intersectVal 2, listA [0,9,1,2,4], listB [3,2,4], skipA 3, skipB 1 输出Reference of the node with value 2 解释第一个正式训练项目编号为 2 注意如果两个列表相交则不能为 0。从各自的表头开始算起链表 A 为 [0,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 解释两套计划完全不同返回 null。从各自的表头开始算起链表 A 为 [2,6,4]链表 B 为 [1,5]。由于这两个链表不相交所以 intersectVal 必须为 0而 skipA 和 skipB 可以是任意值。 注意 如果两个链表没有交点返回 null. 在返回结果后两个链表仍须保持原有的结构。 可假定整个链表结构中没有循环。 程序尽量满足 O(n) 时间复杂度且仅用 O(1) 内存。 本题与主站 160题相同https://leetcode-cn.com/problems/intersection-of-two-linked-lists/ 作者Krahets 链接https://leetcode.cn/leetbook/read/illustration-of-algorithm/7fvoq2/ 来源力扣LeetCode 著作权归作者所有。商业转载请联系作者获得授权非商业转载请注明出处。 暴力解法
利用 unordered_set 这种数据结构存储 A 链表节点由于这种结构的 find 效率很高故可在其中直接检索是否存在 B 链表的节点存在则为交点
class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {unordered_setListNode * addrOfNode;while(headA){addrOfNode.insert(headA);headA headA-next; }while(headB){if(addrOfNode.find(headB) ! addrOfNode.end()){return headB;}else{headB headB-next;}}return nullptr;}
};双指针解法 设置指针 a 和 b 分别遍历两条链表后再遍历对方那一条链表指针相遇有a(b−c)b(a−c)即为交点
class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {ListNode *a headA, *b headB;while(a ! b){a a ? a-next : headB;b b ? b-next : headA;}return a;}
};