查找两个链表的交集节点

时间:2013-11-08 06:43:21

标签: c++ linked-list singly-linked-list

如何查找链表的交集节点?

     A1-->A2-->A3-->A4-->A5-->A6-->A7
                         ^
                         |
               B1-->B2-->B3
  1. A和B是两个链接的链接列表
  2. A1,A2 ... A7和B1 .. B3是列表的节点
  3. 列表A和B在A5处相交。
  4. 我们必须找到交叉点的节点

2 个答案:

答案 0 :(得分:2)

解决方案1:

对于列表中的每个节点,检查下一个节点是否与另一个列表中的节点相同。

   if(A->next == B->next)
   {
      //nodes of interaction
   }

这具有m * n

的复杂性

解决方案2(高效):

  • 查找两个列表的长度(分别为L1和L2)。
  • 找出长度的abs差值[abs(L1-L2)]。
  • 前往从之前的差异中获得的节点。
  • 现在开始检查A-> next是否与B-> next
  • 相同

答案 1 :(得分:1)

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        int length1=0;
        int length2=0;

        ListNode head1 = headA;
        ListNode head2 = headB;
        while(headA!=null){
            length1++;
            headA = headA.next;
        }
        while(headB!=null){
            length2++;
            headB = headB.next;
        }
        int minus = length1-length2;
        int abs = Math.abs(minus);
        if(minus<0){
            int step=abs;
            while(step>0){
                head2 = head2.next;
                step--;
            }
        }else{
            int step=abs;
            while(step>0){
                head1 = head1.next;
                step--;
            }
        }
        if(head1==head2) 
          return head1;
        while(head1!=null&&head2!=null&&head1!=head2)
        {

              head1=head1.next;
              head2=head2.next;

        }
      return head1;  
    }
}