2025/2/26 【双指针】LeetCode 面试题 02.07. 链表相交 【√】
面试题 02.07. 链表相交 - 力扣(LeetCode)
1. 解法1
# 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): # 1. 分别求得两个链表的长度 length_A = length_B = 0 p_A = headA p_B = headB while p_A: length_A += 1 p_A = p_A.next while p_B: length_B += 1 p_B = p_B.next start_A = headA start_B = headB # 2.比较链表长度,找到使得两个链表等长的位置 if length_A > length_B: gap = length_A - length_B while gap: start_A = start_A.next gap -= 1 else: gap = length_B - length_A while gap: start_B = start_B.next gap -= 1 while start_A != start_B: start_A = start_A.next start_B = start_B.next # 3.开始遍历 return start_A
2.等比例法(来自代码随想录)
# 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): # 0.处理边缘情况 if not headA or not headB: return None # 1.分别在两个链表的头部初始化两个指针 start_A = headA start_B = headB # 2.遍历两个链表直到指针相交 while start_A != start_B: start_A = start_A.next if start_A else headB start_B = start_B.next if start_B else headA # 3.如果相交,指针将位于交点节点,如果没有交点,值为None return start_A
注意不要写成:
start_A = start_A.next if start_A.next else headB start_B = start_B.next if start_B.next else headA
这样代码陷入死循环
感受:这道题是【简单题】,如果线性思维去解题,解法1和解法2真不容易想到。需要像做数学的找规律题一样去做。有了这个思路,就会很容易找到规律。
分类:
每日刷题记录
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架