原题
https://leetcode.com/problems/intersection-of-two-linked-lists/
解法
链表A和链表B的长度可能不相等, 所以我们需要将较长的链表多出的节点忽略掉. 定义getLength函数计算链表的长度, 然后将较长的链表的head移动n次, n为多出的长度. 然后同时遍历链表A和链表B, 当headA == headB时, 返回节点. 这里的edge case是两个链表都只有1个节点且在头部重合, 因此判断重合的条件必须是headA == headB, 而不是headA.next == headB.next
Time: O(m) + O(n) + O(max(m, n)), m, n分别是链表的长度
Space: 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
"""
len_a, len_b = self.getLength(headA), self.getLength(headB)
if len_a > len_b:
for i in range(len_a - len_b):
headA = headA.next
else:
for i in range(len_b - len_a):
headB = headB.next
while headA and headB:
if headA == headB:
return headA
headA = headA.next
headB = headB.next
return None
def getLength(self, head):
l = 0
while head:
l += 1
head = head.next
return l