Problem: 面试题 02.07. 链表相交
思路
若两个链表在某一位置相等,那么其从结尾到该位置在两链表长度一样,但是我们不知道这个位置在哪,所以我们可以从结尾截取两个长度一样的链表,用两个指针同时往后遍历,直到发现那个位置。而截取的链表是根据两链表中的最短链表确定
解题方法
先计算两链表的长度,再将长链表的指针往后移两链表长度的差值,这时两链表的指针同长,同时遍历这两个指针,直到发现两个指针相等,输出这个指针,否则输出None
复杂度
时间复杂度:
O ( n ) O(n) O(n)
空间复杂度:
O ( 1 ) O(1) O(1)
Code
# 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:
def get_node_length(node):
c = 0
while node:
node = node.next
c += 1
return c
l1, l2 = get_node_length(headA), get_node_length(headB)
if l1>l2:
headA, headB = headB, headA
l1, l2 = l2, l1
for _ in range(l2- l1):
headB = headB.next
while headA:
if headA == headB:
return headA
headA = headA.next
headB = headB.next
return None