电子商务在线网站建设做网站需要融资
电子商务在线网站建设,做网站需要融资,杭州网站建设很 棒,wordpress 禁止评论文章目录 面试题 02.07. 链表相交题目描述解题思路c代码优化后c代码 面试题 02.07. 链表相交
题目描述
给你两个单链表的头节点 headA 和 headB #xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点#xff0c;返回 null 。
图示两个链表在节点 c1 … 文章目录 面试题 02.07. 链表相交题目描述解题思路c代码优化后c代码 面试题 02.07. 链表相交
题目描述
给你两个单链表的头节点 headA 和 headB 请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点返回 null 。
图示两个链表在节点 c1 开始相交 题目数据 保证 整个链式结构中不存在环。
注意函数返回结果后链表必须 保持其原始结构 。
示例 1 输入intersectVal 8, listA [4,1,8,4,5], listB [5,0,1,8,4,5], skipA 2, skipB 3 输出Intersected at ‘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 输出Intersected at ‘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 解释从各自的表头开始算起链表 A 为 [2,6,4]链表 B 为 [1,5]。 由于这两个链表不相交所以 intersectVal 必须为 0而 skipA 和 skipB 可以是任意值。 这两个链表不相交因此返回 null 。 提示
listA 中节点数目为 mlistB 中节点数目为 n0 m, n 3 * 1041 Node.val 1050 skipA m0 skipB n如果 listA 和 listB 没有交点intersectVal 为 0如果 listA 和 listB 有交点intersectVal listA[skipA 1] listB[skipB 1]
进阶你能否设计一个时间复杂度 O(n) 、仅用 O(1) 内存的解决方案
解题思路
简单来说就是求两个链表交点节点的指针。 这里同学们要注意交点不是数值相等而是指针相等。 为了方便举例假设节点元素数值相等则节点指针相等。 看如下两个链表目前curA指向链表A的头结点curB指向链表B的头结点 我们求出两个链表的长度并求出两个链表长度的差值然后让curA移动到和curB 末尾对齐的位置如图 此时我们就可以比较curA和curB是否相同如果不相同同时向后移动curA和curB如果遇到curA curB则找到交点。
否则循环退出返回空指针。
c代码
函数首先分别计算两个链表的长度然后根据长度差将长链表的指针前移使两个链表在剩余部分拥有相同的长度。接下来同时遍历两个链表直到找到相同的节点即相交的节点或者确定两个链表不相交并返回 nullptr。
class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {// 定义两个指针分别指向两个链表的头节点ListNode* cura headA;ListNode* curb headB;// 定义两个变量用于记录两个链表的长度int ansa 0, ansb 0;// 遍历链表A计算其长度while(cura) {cura cura-next;ansa;}// 遍历链表B计算其长度while(curb) {curb curb-next;ansb;}// 重置cura和curb指针指向各自链表的头节点cura headA;curb headB;// 如果链表A比链表B长将cura指针向前移动ansA - ansB个节点if(ansa ansb) {int n ansa - ansb;while(n--) cura cura-next;// 从当前位置开始逐个对比两个链表的节点是否相同while(cura ! nullptr) {if(cura curb)return cura; // 如果找到相同的节点说明这是相交的节点返回该节点cura cura-next; // 否则继续遍历链表curb curb-next;}}// 如果链表B比链表A长或者两链表等长这时ansb - ansa为0不会进入while循环将curb指针向前移动ansB - ansA个节点else {int n ansb - ansa;while(n--) curb curb-next;// 从当前位置开始逐个对比两个链表的节点是否相同while(curb ! nullptr) {if(cura curb)return cura; // 如果找到相同的节点说明这是相交的节点返回该节点cura cura-next; // 否则继续遍历链表curb curb-next;}}// 如果两个链表不相交返回nullptrreturn nullptr;}
};优化后c代码
首先函数通过两个while循环分别计算链表A和B的长度。之后再次初始化两个指针指向两个链表的头节点。如果链表B比链表A长则交换两者确保cura始终指向较长的链表。之后将cura指针向前移动两个链表长度差值n的距离以使得两个链表从尾部到当前位置的长度相等。最后同步遍历两个链表直到找到相交的节点。
class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {// 初始化两个指针从各自的链表头部开始ListNode* cura headA;ListNode* curb headB;// 初始化两个变量来记录两个链表的长度int ansa 0, ansb 0;// 遍历链表A计算长度ansawhile(cura) {cura cura-next;ansa;}// 遍历链表B计算长度ansbwhile(curb) {curb curb-next;ansb;}// 重置cura和curb指向各自链表的头部cura headA, curb headB;// 如果链表B比链表A长则交换两链表的头指针及长度// 确保cura始终指向较长的链表if(ansb ansa) {swap(ansa, ansb);swap(cura, curb);}// 计算两链表长度的差值int n ansa - ansb;// 将指向较长链表的指针cura向前移动n个节点达到与较短链表对齐while(n--) cura cura-next;// 从对齐位置开始同时遍历两个链表while(cura ! nullptr) {// 如果两指针相遇则返回相遇的节点即为相交的起始节点if(cura curb)return cura;// 否则继续向前遍历cura cura-next;curb curb-next;}// 如果没有交点返回nullptrreturn nullptr;}
};
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/89671.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!