题目链接:160.相交链表
难度:简单

描述:
给你两个单链表的头节点 headAheadB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null

提示:
节点数目:[1, 30000]

题解

思路:
建立两个节点p, q,分别按A -> BB -> A的顺序遍历两个链表,若两个链表有交点,那必然是pq相等的节点。

  1. # Definition for singly-linked list.
  2. # class ListNode:
  3. # def __init__(self, x):
  4. # self.val = x
  5. # self.next = None
  6. class Solution:
  7. def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
  8. p = headA
  9. q = headB
  10. while p is not None or q is not None:
  11. if p is None:
  12. p = headB
  13. if q is None:
  14. q = headA
  15. if p == q:
  16. return q
  17. p = p.next
  18. q = q.next
  19. return None

因为p == q要么是它们相交,要么是它们已经遍历完A + B(即都为None),所以可以简化一下:

  1. # Definition for singly-linked list.
  2. # class ListNode:
  3. # def __init__(self, x):
  4. # self.val = x
  5. # self.next = None
  6. class Solution:
  7. def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
  8. p = headA
  9. q = headB
  10. while p != q:
  11. p = headB if p is None else p.next
  12. q = headA if q is None else q.next
  13. return p