前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >两个单链表相交的问题

两个单链表相交的问题

原创
作者头像
大学里的混子
修改2019-02-19 10:46:50
5390
修改2019-02-19 10:46:50
举报
文章被收录于专栏:LeetCodeLeetCode

两个单链表相交的一系列问题

【 题目】 在本题中, 单链表可能有环, 也可能无环。 给定两个单链表的头节点 head1和head2, 这两个链表可能相交, 也可能 不相交。 请实现一个函数, 如果两个链表相交, 请返回相交的第一个节点; 如果不相交, 返回null 即可。 要求: 如果链表1的长度为N, 链表2的长度为M, 时间复杂度请达到 O(N+M), 额外空间复杂度请达到O(1)

代码语言:javascript
复制
public static class Node {
   public int value;
   public Node next;

   public Node(int data) {
      this.value = data;
   }
}

public static Node getIntersectNode(Node head1, Node head2) {
   if (head1 == null || head2 == null) {
      return null;
   }
   Node loop1 = getLoopNode(head1);
   Node loop2 = getLoopNode(head2);
   if (loop1 == null && loop2 == null) {
      return noLoop(head1, head2);
   }
   if (loop1 != null && loop2 != null) {
      return bothLoop(head1, loop1, head2, loop2);
   }
   return null;
}


//寻找第一个入环的节点 如果有则返回  如果没有返回空
public static Node getLoopNode(Node head) {
   if (head == null || head.next == null || head.next.next == null) {
      return null;
   }
   Node n1 = head.next; // n1 -> slow
   Node n2 = head.next.next; // n2 -> fast
   while (n1 != n2) {
      if (n2.next == null || n2.next.next == null) {
         return null;
      }
      n2 = n2.next.next;
      n1 = n1.next;
   }
   n2 = head; // n2 -> walk again from head
   while (n1 != n2) {
      n1 = n1.next;
      n2 = n2.next;
   }
   return n1;
}


//没有环的情况下,起初让指针移动到距离相交节点等距的位置 然后再一起往后移动
public static Node noLoop(Node head1, Node head2) {
   if (head1 == null || head2 == null) {
      return null;
   }
   Node cur1 = head1;
   Node cur2 = head2;
   int n = 0;
   while (cur1.next != null) {
      n++;
      cur1 = cur1.next;
   }
   while (cur2.next != null) {
      n--;
      cur2 = cur2.next;
   }
   if (cur1 != cur2) {
      return null;
   }
   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;
}


//
public static Node bothLoop(Node head1, Node loop1, Node head2, Node loop2) {
   Node cur1 = null;
   Node cur2 = null;
   if (loop1 == loop2) {
      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;
   }
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档