160. 相交链表
思路
难点在于,由于两条链表的长度可能不同,两条链表之间的节点无法对应:如果用两个指针 p1 和 p2 分别在两条链表上前进,并不能同时走到公共节点,也就无法得到相交节点 c1。
解决这个问题的关键是,通过某些方式,让 p1 和 p2 能够同时到达相交节点 c1。
让 p1 遍历完链表 A 之后开始遍历链表 B,让 p2 遍历完链表 B 之后开始遍历链表 A,这样相当于「逻辑上」两条链表接在了一起。
如果这样进行拼接,就可以让 p1 和 p2 同时进入公共部分,也就是同时到达相交节点
代码
Python
# 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) -> Optional[ListNode]:
# p1 指向 A 链表头结点,p2 指向 B 链表头结点
p1 = headA
p2 = headB
while p1 != p2:
# 如果 p1 到达链表 A 的末尾,则将其重定向到链表 B 的头部
p1 = headB if p1 is None else p1.next
# 如果 p2 到达链表 B 的末尾,则将其重定向到链表 A 的头部
p2 = headA if p2 is None else p2.next
return p1
浙公网安备 33010602011771号