题目
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
图示两个链表在节点 c1 开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
示例 1:
输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Intersected at '8'
解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。
在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
思路
用p、q分别走一遍链表A和B,如果有相等的就直接返回。如果第一遍走完都没有相等的,就让p、q分别再反过来走一次链表B和A,如果有相等的就直接返回。
用flag标识这两个指针总共走过了几个链表, 如果flag>2,说明一定有一个指针已经扫完了链表A和链表B,也就是没有找到相交元素,直接返回NULL。
# 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 headA==None or headB==None:
return None
p = headA
q = headB
flag = 0
while True:
if p == q:
return p
p = p.next
q = q.next
if p==None and flag<2:
flag += 1
p = headB
if q==None and flag<2:
flag += 1
q = headA
if flag>2:
break
return None
上面是我自己写的,又臭又长,后来学习到了大佬的简洁写法,记录一下。
# 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:
p = headA
q = headB
while p!=q:
p = headB if p==None else p.next
q = headA if q==None else q.next
return p