题目:
编写一个程序,找到两个单链表相交的起始节点。
例如,下面的两个链表:
A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3
在节点 c1 开始相交。
注意:
- 如果两个链表没有交点,返回
null
. - 在返回结果后,两个链表仍须保持原有的结构。
- 可假定整个链表结构中没有循环。
- 程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
代码 :
# 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 headA == None or headB == None:
return None
tempA = headA
tempB = headB
lenA = 0
lenB = 0
while headA:
lenA += 1
headA = headA.next
while headB:
lenB += 1
headB = headB.next
cha = abs(lenA - lenB)
if lenA > lenB:
while cha > 0:
tempA = tempA.next
cha -= 1
elif lenA < lenB:
while cha >0:
tempB = tempB.next
cha -= 1
while tempA != None and tempB != None:
if tempA == tempB:
return tempA
tempA = tempA.next
tempB = tempB.next
return None
思路:
首先,判断两个链表是不是空链表。若不是空链表,求两个链表的长度之差cha。让较长链表先走cha步长,然后两个链表一起走。若在两个链表走完之前有相同节点,第一个相同节点即为开始相交的点。