动画趣解计算机知识,又生动又硬核~更多内容欢迎关注微信公众号:
pipi的奇思妙想
你以为我打算讲算法,其实我准备讲爱情…
故事的开始,是一道算法题:
题目:
如何找到两个单链表相交的起始节点。
要求:
如果两个链表没有交点,返回 null.
在返回结果后,两个链表仍须保持原有的结构。
可假定整个链表结构中没有循环。
程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
题目链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists/
来来来,我们开始讲爱情:
戳下面视频:
想见你浪漫的爱情故事之如何找到两个单链表相交的起始节点
解释:
一种比较巧妙的方式是,分别为链表A和链表B设置指针A和指针B,遍历链表,如果遍历完链表,将指针指向另外一个链表的头部继续遍历,直至两个指针相遇。
最终两个指针分别走过的路径为:
指针A :a+c+b
指针B :b+c+a
明显 a+c+b = b+c+a,因而如果两个链表相交,则指针A和指针B必定在相交结点相遇。
这一方法的时间复杂度为o(m+n),其中m和n分别为两个指针的长度,空间复杂度为o(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) -> ListNode:
if not headA or not headB:
return None
nodeA = headA
nodeB = headB
while(nodeA !=nodeB):
nodeA = nodeA.next if nodeA else headB
nodeB = nodeB.next if nodeB else headA
return nodeA
总结:
如果你够浪漫,算法题都能刷出爱情的味道。
妈妈我在努力学习呢…看我真挚的眼神
动画趣解计算机知识,又生动又硬核~更多内容欢迎关注微信公众号:
pipi的奇思妙想