LeetCode HOT 100 —— 160. 相交链表

113 阅读1分钟

LeetCode HOT 100 —— 160. 相交链表

链表

题目描述

给你两个单链表的头节点 headAheadB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null

图示两个链表在节点 c1 开始相交:

image.png

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构

进阶: 你能否设计一个时间复杂度 O(m + n) 、仅用 O(1) 内存的解决方案?

解题思路

  1. 暴力他,双重for循环,依次比较。时间复杂度 O(n2),空间复杂度满足进阶
  2. Hash,现将一条链表存储到map中,然后再循环。时间复杂度满足进阶,空间复杂度 O(n)
  3. 双指针,当一条链表的指针走到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
};