LeetCode HOT 100 —— 160. 相交链表
链表
题目描述
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
图示两个链表在节点 c1 开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
进阶: 你能否设计一个时间复杂度 O(m + n) 、仅用 O(1) 内存的解决方案?
解题思路
- 暴力他,双重for循环,依次比较。时间复杂度 O(n2),空间复杂度满足进阶
- Hash,现将一条链表存储到map中,然后再循环。时间复杂度满足进阶,空间复杂度 O(n)
- 双指针,当一条链表的指针走到null,当前指针指向另一个链表。交换后,两个指针到相交节点的步长相同。时间和空间复杂度都满足。
解题代码
双指针解法
var getIntersectionNode = function(headA, headB) {
if(!headA || !headB) return null
let a = headA, b = headB
while(a != b) {
a = a == null ? headB : a.next
b = b == null ? headA : b.next
}
return a
};