此题很无语,因为这道寻找交叉节点的题
1、不能用反转链表来做,否则当你反转了第一个链表的时候,如果第二个链表和第一个链表有交叉,第二个链表的尾部也乱了
2、寻找的是相同的引用,就是看上面的示例1,虽然两个链表的尾部都是 1 8 4 5,但是第一个1不是交叉节点,8才是,这需要我们在每次判断是否为交叉节点时,不能比较值是否相等,而是比较引用是否相等
思路:如果两个链表有交叉,那么交叉点一定在更短一些的链表中
于是我们先获取2个链表的长度,并将两个链表尾部对齐,
然后舍弃较长的链表中前部多出来的部分
此后,我们对两个链表中每个元素进行遍历
当找到相等的引用时 返回之
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def __init__(self):
self.new1 = None
self.new2 = None
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
len1 = 0
len2 = 0
cur1 = headA
cur2 = headB
while cur1 is not None:
len1 += 1
cur1 = cur1.next
while cur2 is not None:
len2 += 1
cur2 = cur2.next
if len1 != len2:
todo = headA if len1 > len2 else headB
wait = headB if len1 > len2 else headA
for i in range(abs(len1 - len2)):
todo = todo.next
else:
todo = headB
wait = headA
res = None
while todo is not None:
if todo == wait:
return todo
todo = todo.next
wait = wait.next
return None