0.总结
1.思想
直接的思想便是,顺序遍历两个链表,然后将所有的结点放到一个set中, 最后求这两个set
是否存在存在交集,如果有交集,那么直接输出,如果没有返回None
。
但是应该思考思考,有没有更好的方法?其实是有的。
我们想找出两个链表的相交点,主要方法就是遍历,但是因为二者到达相交点的时刻t是不同的,所以就很难保证访问的是同一个节点,从而找不出节点。但是如果我们控制链表起初的访问节点,即保证两条链表的剩余长度相同,再遍历时,就可以保证找到相交节点了。
2.代码
'''
思想:
(1)先求出两个链表的长度
(2)让长链表先走,走到剩余长度和短链表相同时,二者同时走,然后比较节点是否相同
'''
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
len_a = self.get_length(headA)
len_b = self.get_length(headB)
# print(len_a,len_b)
if len_a < len_b: # b 长,b先走
cnt = 0
while(cnt < (len_b-len_a) and headB.next):
headB = headB.next
cnt+=1
elif len_b < len_a: # a 长,a先走
cnt = 0
while(cnt < (len_a-len_b) and headA.next):
headA = headA.next
cnt+=1
# print(headA.val,headB.val)
# 剩余相同长度,同时出发
while(headA and headB):
if headA == headB:
return headB
else:
headB = headB.next
headA = headA.next
return None
def get_length(self,head):
length = 0
while head is not None:
head = head.next
length+=1
return length