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'上走,乙同理。

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

原文地址:https://www.cnblogs.com/tbgatgb/p/10964856.html