nick-fewings-PTw_2g55U8w-unsplash.jpg
简单给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

图示两个链表在节点 c1 开始相交:
LC.相交链表 - 图2
题目数据 保证 整个链式结构中不存在环。

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

作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/linked-list/jjbj2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

解法1

  1. /**
  2. * Definition for singly-linked list.
  3. * function ListNode(val) {
  4. * this.val = val;
  5. * this.next = null;
  6. * }
  7. */
  8. /**
  9. * @param {ListNode} headA
  10. * @param {ListNode} headB
  11. * @return {ListNode}
  12. */
  13. var getIntersectionNode = function (headA, headB) {
  14. if (!headA || !headB) {
  15. return null;
  16. }
  17. // 设置两个指针
  18. let p1 = headA;
  19. let p2 = headB;
  20. while (p2 !== null) {
  21. if (!p1 || !p1.next) {
  22. p1 = headA;
  23. p2 = p2.next;
  24. }
  25. if (p1 === p2) {
  26. return p1;
  27. }
  28. p1 = p1.next;
  29. }
  30. return null;
  31. };

解法2

  1. /**
  2. * Definition for singly-linked list.
  3. * function ListNode(val) {
  4. * this.val = val;
  5. * this.next = null;
  6. * }
  7. */
  8. /**
  9. * @param {ListNode} headA
  10. * @param {ListNode} headB
  11. * @return {ListNode}
  12. */
  13. var getIntersectionNode = function (headA, headB) {
  14. if (!headA || !headB) {
  15. return null;
  16. }
  17. // 设置两个指针
  18. let p1 = headA;
  19. let p2 = headB;
  20. const set = new Set();
  21. while (p1 !== null) {
  22. set.add(p1);
  23. p1 = p1.next;
  24. }
  25. while (p2 !== null) {
  26. if (set.has(p2)) {
  27. return p2;
  28. }
  29. p2 = p2.next;
  30. }
  31. return null;
  32. };