链表的相交节点

链表的相交节点

问题

这个题目说的是,给你两个单链表,你要找到它们相交的第一个节点。如果两个链表没有相交,则返回空指针。假设链表无环,并且你不能改变它的原始结构。另外要求算法是线性时间复杂度,空间复杂度要求是 O(1)。

比如说,两条链表分别是:

A:     1 -> 2
              \
               6 -> 7 -> null
              /
B: 3 -> 4 -> 5

你要返回的是 6 这个节点。

代码

public class AlgoCasts {

  public class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
      val = x;
    }
  }

  // Time: O(m+n), Space: O(1)
  public ListNode getIntersectionNodeWithoutLen(ListNode headA, ListNode headB) {
    if (headA == null || headB == null) return null;
    ListNode p = headA, q = headB;
    while (p != q) {
      p = p == null ? headB : p.next;
      q = q == null ? headA : q.next;
    }
    return p;
  }

  // Time: O(m+n), Space: O(1)
  public ListNode getIntersectionNodeWithLen(ListNode headA, ListNode headB) {
    int lenA = 0, lenB = 0;
    for (ListNode p = headA; p != null; p = p.next, ++lenA);
    for (ListNode p = headB; p != null; p = p.next, ++lenB);
    ListNode p = headA, q = headB;
    if (lenA > lenB)
      for (int i = 0; i < lenA - lenB; ++i) p = p.next;
    else
      for (int i = 0; i < lenB - lenA; ++i) q = q.next;
    while (p != q) {
      p = p.next;
      q = q.next;
    }
    return p;
  }

}

  转载请注明: ForwardXu 链表的相交节点

 上一篇
单链表删除数字 单链表删除数字
单链表删除数字问题 这个题目说的是,给你一个单链表和一个数字,你要删除节点上数字等于给定数字的那些节点,然后返回删除节点后的单链表。 比如说,给你的单链表是: 1 -> 2 -> 4 -> 1 -> 8 -> 1 要删除的数字是 1。那
2018-12-27
下一篇 
有序数组中查找数字的开始和结束下标 有序数组中查找数字的开始和结束下标
有序数组中查找数字的开始和结束下标问题 这个题目说的是,给你一个递增排序的数组和一个目标值,你要找到目标值在这个数组中的开始下标和结束下标。如果找不到目标值,就返回 [-1, -1]。 比如说,给你的递增数组是: 1, 2, 2, 4,
2018-12-26
  目录