zoukankan      html  css  js  c++  java
  • 14-160. Intersection of Two Linked Lists

    题目描述:

    Write a program to find the node at which the intersection of two singly linked lists begins.

    For example, the following two linked lists:

    begin to intersect at node c1.

    Example 1:

    Input: intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
    Output: Reference of the node with value = 8
    Input Explanation: The intersected node's value is 8 (note that this must not be 0 if the two lists intersect). From the head of A, it reads as [4,1,8,4,5]. From the head of B, it reads as [5,0,1,8,4,5]. There are 2 nodes before the intersected node in A; There are 3 nodes before the intersected node in B.

    Example 2:

    Input: intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
    Output: Reference of the node with value = 2
    Input Explanation: The intersected node's value is 2 (note that this must not be 0 if the two lists intersect). From the head of A, it reads as [0,9,1,2,4]. From the head of B, it reads as [3,2,4]. There are 3 nodes before the intersected node in A; There are 1 node before the intersected node in B.
    

    Example 3:

    Input: intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
    Output: null
    Input Explanation: From the head of A, it reads as [2,6,4]. From the head of B, it reads as [1,5]. Since the two lists do not intersect, intersectVal must be 0, while skipA and skipB can be arbitrary values.
    Explanation: The two lists do not intersect, so return null.
    

    Notes:

    • If the two linked lists have no intersection at all, return null.
    • The linked lists must retain their original structure after the function returns.
    • You may assume there are no cycles anywhere in the entire linked structure.
    • Your code should preferably run in O(n) time and use only O(1) memory.

    代码:

     1 # Definition for singly-linked list.
     2 # class ListNode(object):
     3 #     def __init__(self, x):
     4 #         self.val = x
     5 #         self.next = None
     6 
     7 class Solution(object):
     8     def getIntersectionNode(self, headA, headB):
     9         """
    10         :type head1, head1: ListNode
    11         :rtype: ListNode
    12         """
    13         if headA is None or headB is None:
    14             return None
    15 
    16         pa = headA
    17         pb = headB
    18 
    19         while pa is not pb:
    20             pa = headB if pa is None else pa.next
    21             pb = headA if pb is None else pb.next
    22 
    23         return pa

    分析:

    代码是基于这样的考虑:给定两根绳子(它们的长度可以相等也可以不相等),已知两条绳子有一个交点,甲沿着A绳走,乙沿着B绳走,问他们在何处相遇?

    思路是另取两根绳子A' 和 B' ,绳子的长度为: A' = B,  B' = A,将A'接在A的后面,B'接在B的后面,甲走到A绳的尽头后继续在A'上走,乙同理。

    则此时甲和乙走的总长度是相等的,且他们的速度一样,那么他们必会相遇,相遇的地方就是原来的两条绳子相交的地方。

  • 相关阅读:
    大众CAN TP2.0协议说明
    统一诊断服务 (Unified diagnostic services , UDS) (七)
    统一诊断服务 (Unified diagnostic services , UDS) (六)
    统一诊断服务 (Unified diagnostic services , UDS) (五)
    统一诊断服务 (Unified diagnostic services , UDS) (四)
    统一诊断服务 (Unified diagnostic services , UDS) (三)
    asp.net 网页拉伸 到300%不变形方法一
    C# WinForm 禁止最大化、最小化、双击标题栏、双击图标等操作记录
    VS系列软件中debug和release编译环境有什么区别
    软件设计开发思想总结
  • 原文地址:https://www.cnblogs.com/tbgatgb/p/10964856.html
Copyright © 2011-2022 走看看