原题地址:https://leetcode.com/problems/intersection-of-two-linked-lists/description/
题目描述:
Write a program to find the node at which the intersection of two singly linked lists begins.
For example, the following two linked lists:
A: a1 → a2
↘
c1 → c2 → c3
↗
B: b1 → b2 → b3
begin to intersect at node c1.
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.
求两个单向链表的交点,可以转化为之前做过的问题,即求一个单项链表是否有环。
将其中一个链表的尾部接到自己的头部。再从另一个链表开始判断是否有环。
如果两个链表不相交,则另一个链表中也不会有环;
如果相交,则环的入口既是交点。
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def getIntersectionNode(self, headA, headB):
"""
:type head1, head1: ListNode
:rtype: ListNode
"""
if headB is None or headA is None:
return None
tail = headB
while (tail.next is not None):
tail = tail.next
tail.next = headB
a = b = headA
while (a is not None and b is not None):
a = a.next
b = b.next
if b is not None:
b = b.next
else:
tail.next = None
return None
if a == b:
c = headA
d = a
while(1):
if c == d:
tail.next = None
return c
c = c.next
d = d.next
tail.next = None
return None
42 / 42 test cases passed.
Status: Accepted
Runtime: 351 ms