解法一: “循环相遇法“ (本质为快慢指针技巧)
解题思路:”循环“ :单链表A与单链表B从自己的起点开始(头结点),各自遍历自己的链表,当某个指针遍历完了他的链表后,回首开始从另一个单链表的头结点开始遍历,直到有一天…两者相遇,返回即可。
图示:
代码:
在这里插入代码片
# 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:
#边缘条件
if not headA or not headB:
return None
headA_pointer = headA
headB_pointer = headB
#开始遍历,直到两者相遇
while headA_pointer != headB_pointer:
headA_pointer = headA_pointer.next if headA_pointer else headB
headB_pointer = headB_pointer.next if headB_pointer else headA
return headA_pointer
技术总结:
这个算法也浪漫了吧,错的人迟早会走散,而对的人迟早会相逢!
时间复杂度: Tn=O(m+n)
空间复杂度:Sn = O(1)
解法二: “暴力求解“
时间复杂度: Tn=O(m*n)