您的位置:首页 > 财经 > 产业 > 怎样制作网页链接教程_3d人物建模软件_seo是如何做优化的_杭州网站优化咨询

怎样制作网页链接教程_3d人物建模软件_seo是如何做优化的_杭州网站优化咨询

2024/12/27 23:55:12 来源:https://blog.csdn.net/m0_73983707/article/details/144010066  浏览:    关键词:怎样制作网页链接教程_3d人物建模软件_seo是如何做优化的_杭州网站优化咨询
怎样制作网页链接教程_3d人物建模软件_seo是如何做优化的_杭州网站优化咨询

被你改变的那部分我,代替你,永远与我站在一起

                                                                        —— 24.11.28

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
输出:No intersection
解释:从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。
由于这两个链表不相交,所以 intersectVal 必须为 0,而 skipA 和 skipB 可以是任意值。
这两个链表不相交,因此返回 null 。 

提示:

  • listA 中节点数目为 m
  • listB 中节点数目为 n
  • 1 <= m, n <= 3 * 104
  • 1 <= Node.val <= 105
  • 0 <= skipA <= m
  • 0 <= skipB <= n
  • 如果 listA 和 listB 没有交点,intersectVal 为 0
  • 如果 listA 和 listB 有交点,intersectVal == listA[skipA] == listB[skipB]

方法一:暴力遍历

类似于冒泡循环,对于每一个元素都整体遍历一遍另一个链表,看两者中是否有节点相同,如果有节点相等,就退出循环,如果没有,则将所有元素遍历比较结束后,退出循环,返回null值

Java实现:

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode(int x) {*         val = x;*         next = null;*     }* }*/
public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {ListNode p = headA;ListNode q = headB;for(p = headA; p != null; p = p.next){for(q = headB; q != null; q = q.next){if(p == q){return p;}}}return null;}
}


方法二:存入容器后直接查询

Java实现

将其中一个链表中的所有节点都存入哈希表中,然后遍历第二个链表,调用contains方法,看第一个链表存入的哈希表中是否含有第二个链表中的某一节点,由于是从头到尾遍历,所以在遍历第二个链表过程中第一个判断包含的节点就是二者首次相交的节点,进行返回即可

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode(int x) {*         val = x;*         next = null;*     }* }*/
public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {Set<ListNode> s = new HashSet<>();for (ListNode p = headA; p != null; p = p.next) {s.add(p);}for (ListNode p = headB; p != null; p = p.next) {if (s.contains(p))return p;}return null;}
}


Python实现

遍历链表A,并将其节点存入集合

遍历B的每个节点并在集合中进行查询,一旦遍历过程中查询到相同节点,即说明有交点,否则无

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution:def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:A = set()cur1 = headAcur2 = headBwhile cur1:A.add(cur1)cur1 = cur1.nextwhile cur2:if cur2 in A:return cur2cur2 = cur2.nextreturn None


方法三: 双指针

先遍历其中一个链表,当到底末端后跳到另一链表,最后

若两链表没有公共结点,那么两个链表指针都会走过 s1+s2个结点,同时到达两链表末尾

若有公共结点,由于最后会同时走到两链表终点,所以倒退回去,两个指针一定会在第一个公共结点处相遇

当然,若两链表等长,那确实不会跳到另一链表,不过链表等长本身指针就是同步的,同样也能找到公共结点

初始化指针:

首先创建了两个指针和g,分别初始化为链表A的头节点headA和链表B的头节点headB。这两个指针将用于遍历两个链表。
循环查找相交节点:
进入一个while循环,循环的条件是p和q不相等。在每次循环中,会对p和q进行移动操作。

对于指针p:

通过p=p== null?headB :p.next;这行代码来移动p指针。它的逻辑是,如果p指针当前指向的节点为null(意味着已经遍历完链表A),那么就将p重新指向链表B的头节点headB,开始遍历链表B;如果p当前指向的节点不为null,那么就将移动到下一个节点(即p.next)。

对于指针q:

类似地,通过g=g== null?headA :q.next;来移动g指针。也就是当q指针当前指向的节点为null(即已经遍历完链表B)时,将q重新指向链表A的头节点head,开始遍历链表A;若q当前指向的节点不为null,则将q移动到下一个节点(q.next)

返回结果:

当p和q相等时,循环结束。此时有两种情况:
如果p(和q)为null,说明两个链表没有相交节点,那么返回null符合预期。如果p(和g)不为null,则说明找到了相交节点,此时返回p(或者q,因为它们此时指向同一个节点),这个节点就是两个链表的相交节点。


Java实现

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode(int x) {*         val = x;*         next = null;*     }* }*/
public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {ListNode p = headA, q = headB;while (p != q) {p = p == null ? headB : p.next;q = q == null ? headA : q.next;}return p;}
}


Python实现

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution:def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:p = headAq = headBwhile p != q:p = p.next if p else headBq = q.next if q else headAreturn p

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com