给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
图示两个链表在节点 c1 开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
示例 1:
示例 2:
示例 3:
注意:
是相同的Node,而不是Node中的元素相同。一旦找到了相同的Node,那么后面必然都相同了,因为Node后面的链接肯定是一样的,因为是同一个Node。
思路:
先求出两个LinkedList的长度,让长的LinkedList为B,短的LinkedList为A,让cur B往前移动(len(B)-len(A))个Node,此时两个LinkedList尾部对齐了。比较cur A和cur B,如果相同,就找到了交点。如果不相同,就让curA和curB同时向后移动一个Node,再比较,以此类推,直到结尾,如果还是不相同,那么就是没有交点,返回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) -> Optional[ListNode]:
lenA = 0
lenB = 0
cur = headA
while cur:
cur=cur.next
lenA += 1
cur=headB
while cur:
cur = cur.next
lenB += 1
if lenA > lenB:
lenA, lenB = lenB, lenA
headA, headB = headB, headA
curA = headA
curB = headB
for i in range(lenB-lenA):
curB = curB.next
while curA:
if curA == curB:
return curA
curA = curA.next
curB = curB.next
return None
正确,注意以下几点:
1. 记得先让curB移动(lenB-lenA)个Node。
2. if statement里面比较是否相等用的是 == ,而不是=
3. 交换长度后,较长的是B