1. 题目描述
  2. 编写一个程序,找到两个单链表相交的起始节点。
  3. 示例1
  4. 输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
  5. 输出:Reference of the node with value = 8
  6. 输入解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。从各自的表头开始算起,链表 A [4,1,8,4,5],链表 B [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
  7. 示例2
  8. 输入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
  9. 输出:Reference of the node with value = 2
  10. 输入解释:相交节点的值为 2 (注意,如果两个链表相交则不能为 0)。从各自的表头开始算起,链表 A [0,9,1,2,4],链表 B [3,2,4]。在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。
  11. 示例3
  12. 输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
  13. 输出:null
  14. 输入解释:从各自的表头开始算起,链表 A [2,6,4],链表 B [1,5]。由于这两个链表不相交,所以 intersectVal 必须为 0,而 skipA skipB 可以是任意值。
  15. 解释:这两个链表不相交,因此返回 null
  16. 注意:
  17. 如果两个链表没有交点,返回 null.
  18. 在返回结果后,两个链表仍须保持原有的结构。
  19. 可假定整个链表结构中没有循环。
  20. var getIntersectionNode = function(headA, headB) {
  21. //TODO
  22. }

我的回答

  1. var getIntersectionNode = function(headA, headB) {
  2. //TODO
  3. let intersect = null
  4. while(headA.next || headB.next) {
  5. if (headA.value == headB.value) {
  6. if (intersect) {
  7. continue;
  8. } else {
  9. intersect = headA.value
  10. }
  11. } else {
  12. intersect = null
  13. }
  14. headA = headA.next
  15. headB = headB.next
  16. }
  17. return intersect
  18. }

参考回答

  1. // 思路:
  2. // 1. 双指针分别获取链表长度;
  3. // 2. 判断结尾是否一致来确认是否相交;
  4. // 3. 重置两个指针
  5. // 4. 对于长的链表,其指针先走长度差的步数,然后两个链表的指针一块走,相交时就是链表交点
  6. var getIntersectionNode = function (headA, headB) {
  7. let pointA = headA, lengthA = 0
  8. let pointB = headB, lengthB = 0
  9. while (pointA) { lengthA++ pointA = pointA.next }
  10. while (pointB) { lengthB++ pointB = pointB.next }
  11. if (pointA !== pointB) { return null }
  12. let len pointA = headA pointB = headB
  13. if (lengthA >= lengthB) {
  14. len = lengthA - lengthB
  15. while (len > 0) {
  16. pointA = pointA.next len--
  17. }
  18. } else {
  19. len = lengthB - lengthA
  20. while (len > 0) {
  21. pointB = pointB.next len--
  22. }
  23. }
  24. while (pointB !== pointA) { pointB = pointB.next pointA = pointA.next }
  25. return pointA
  26. };
  27. //思路:双指针
  28. var getIntersectionNode = function(headA, headB) {
  29. if (headA === null || headB === null) return null
  30. let pa = headA
  31. let pb = headB
  32. while(pa !== pb) {
  33. pa = pa === null ? headB : pa.next
  34. pb = pb === null ? headA : pb.next
  35. }
  36. return pa
  37. };