【算法04天:Day4】第二章链表 LeetCode 链表相交(160)

76 阅读1分钟

题目三:

image.png

image.png

image.png

解题思路:这个题看了一下随想录的一点思路,但是瞧了一眼代码,核心代码看不太懂,然后就自己写了

,写到最后一直通不过,原来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。

image.png

总结:map中添加元素为add方法。

复杂度分析

时间复杂度:O(m+n),其中 m 和 n 是分别是链表 headA 和 headB 的长度。需要遍历两个链表各一次。

空间复杂度:O(m),其中 mm 是链表 headA 的长度。需要使用哈希集合存储链表 headA 中的全部节点。

解法三:(暴力解法)

解法思路:对于链表 A 的每个节点,都去链表 B 中遍历一遍找看看有没有相同的节点。

image.png

解法四: (双指针二)

image.png

image.png

image.png

image.png