公众号:深度学习视觉
博客:https://fainke.com
Link:相交链表
语言:Python
难度:简单
描述:找到两个单链表的重合链。比如:
Node_A = [4,1,8,4,5]; Node_B = [5,0,1,8,4,5],则这两个链表的起始节点为8,重合链为[8,4,5]。
Node_A = [4,1,7,2,1]; Node_B = [5,0,1,8,4,5],则这两个链表的起始节点为null,不存在。
方法一:
-
将其中一个Node_A链表的所有子链表存储到Set_A中;
-
遍历Node_B,判断其node.next是否存在于Set_A中,如果有则直接返回node.next,否则则遍历结束返回None。
Code:
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
A = set()
cur1 = headA
cur2 = headB
while cur1:
A.add(cur1)
cur1 = cur1.next
while cur2:
if cur2 in A:
return cur2
cur2 = cur2.next
return None
方法二:
-
分别遍历两个链表,得到两个链表的长度差距;
-
让长的先做node.next,使得它们俩等长;
-
同时遍历两个链表,直到子链相同则停止遍历。
Code:
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
cur1 = headA
cur2 = headB
n = 0
# 1
while cur1:
n += 1
cur1 = cur1.next
while cur2:
n -= 1
cur2 = cur2.next
if cur1 != cur2:
return None
cur1 = headA if n > 0 else headB
cur2 = headB if cur1 == headA else headA
n = abs(n)
# 2
while n:
n -= 1
cur1 = cur1.next
# 3
while cur1 != cur2:
cur1 = cur1.next
cur2 = cur2.next
return cur1
return None
方法三:
-
同时遍历两个链表;(假设长度分别为m,n,相交节点之后的长度为k)
-
当短的链表到达尾节点的时候n,开始遍历长链表m;
-
当长的链表到达尾节点的时候m,开始遍历短链表n;(此时两个链表的遍历长度将相同)
-
继续遍历,直到出现相同子链。(n+m-k与m+n-k处相交,k=0时则为null)
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
cur1 = headA
cur2 = headB
while cur1 != cur2:
cur1 = cur1.next if cur1 else headB
cur2 = cur2.next if cur2 else headA
return cur1