logologo

两个有环链表,返回第一个相交节点,如果不相交返回 NULL

Sep 5, 2023

两个有环链表,返回第一个相交节点,如果不相交返回 NULL

public Node bothLoop(Node head1, Node loop1, Node head2, Node loop2) {
  Node cur1 = null, cur2 = null;
  if (loop1 == loop2) {
    // 此情况下 解决相交点在环外 就是 两个链表都无环,返回第一个相交节点,如果不相交,返回null
    cur1 = head1;
    cur2 = head2;
    int n = 0;
    while (cur1 != loop1) {
      n++;
      cur1 = cur1.next;
    }
    while (cur2 != loop2) {
      n--;
      cur2 = cur2.next;
    }
    cur1 = n > 0 ? head1 : head2;
    cur2 = cur1 == head1 ? head2 : head1;
    n = Math.abs(n);
    while (n != 0) {
      n--;
      cur1 = cur1.next;
    }
    while (cur1 != cur2) {
      cur1 = cur1.next;
      cur2 = cur2.next;
    }
    return cur1;
  } else {
    // 此情况解决 两个环链表不相交 或 相交在同一个环中
    cur1 = loop1.next;
    while (cur1 != loop1) {
      if (cur1 == loop2)
        return loop1;
      cur1 = cur1.next;
    }
    return null;
  }
}

C++Java
浙ICP备2021022773号    2022-PRESENT © ZhengKe