题目: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.
题意:找到两个链表相交的节点。
注意:
如果没有相交,返回NULL;
链表保持原状,不能改变结构;
链表无环;
空间复杂度O(1), 时间复杂度O(n).
方法一:性能535ms(又一次暴力。。)
# 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
ha = headA
lha = 1
while ha.next != None:
ha = ha.next
lha += 1
hb = headB
lhb = 1
while hb.next != None:
hb = hb.next
lhb += 1
if ha != hb:
return None
ha = headA
hb = headB
if lha > lhb:
for i in range(lha - lhb):
ha = ha.next
elif lhb > lha:
for i in range(lhb - lha):
hb = hb.next
while ha != hb:
ha = ha.next
hb = hb.next
return ha
方法二:性能388ms
# 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
"""
A_set=set()
while headA:
A_set.add(headA)
headA=headA.next
while headB:
if headB in A_set:
return headB
headB=headB.next
return None
方法三:性能345ms
# 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
"""
p1=headA
p2=headB
len1=0
len2=0
while p1:
len1+=1
p1=p1.next
while p2:
len2+=1
p2=p2.next
if len1>len2:
diff=len1-len2
while diff>0:
headA=headA.next
diff-=1
else :
diff=len2-len1
while diff>0:
headB=headB.next
diff-=1
while headA:
if headA==headB:
return headA
else:
headA=headA.next
headB=headB.next