题目三:
解题思路:这个题看了一下随想录的一点思路,但是瞧了一眼代码,核心代码看不太懂,然后就自己写了
,写到最后一直通不过,原来while写成了if,改了之后就通过了。
解法一:(双指针法)
let count = 0
let cur = head
while(cur) {
count++
cur = cur.next
}
return count
}
var getIntersectionNode = function(headA, headB) {
if(headA === null || headB === null) return null
let tempA = headA
let tempB = headB
let lengthA = getListNodeLength(headA)
let lengthB = getListNodeLength(headB)
let i = lengthA < lengthB ? lengthB - lengthA : lengthA - lengthB
if (lengthA < lengthB) {
while(i--) {
tempB = tempB.next
}
} else {
while(i--) {
tempA = tempA.next
}
}
while ( tempA !== tempB) {
tempA = tempA.next
tempB = tempB.next
}
return tempA
};
解法二:(哈希表,参考LeetCode官方)
解题思路:
判断两个链表是否相交,可以使用哈希集合存储链表节点。
首先遍历链表 headA,并将链表 headA 中的每个节点加入哈希集合中。然后遍历链表 headB,对于遍历到的每个节点,判断该节点是否在哈希集合中:
如果当前节点不在哈希集合中,则继续遍历下一个节点;
如果当前节点在哈希集合中,则后面的节点都在哈希集合中,即从当前节点开始的所有节点都在两个链表的相交部分,因此在链表 headB 中遍历到的第一个在哈希集合中的节点就是两个链表相交的节点,返回该节点。
如果链表 headB 中的所有节点都不在哈希集合中,则两个链表不相交,返回 null。
总结:map中添加元素为add方法。
复杂度分析
时间复杂度:O(m+n),其中 m 和 n 是分别是链表 headA 和 headB 的长度。需要遍历两个链表各一次。
空间复杂度:O(m),其中 mm 是链表 headA 的长度。需要使用哈希集合存储链表 headA 中的全部节点。
解法三:(暴力解法)
解法思路:对于链表 A 的每个节点,都去链表 B 中遍历一遍找看看有没有相同的节点。
解法四: (双指针二)