Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过反转列表找到两个列表的合并点_Java_Data Structures_Merge_Linked List_Nodes - Fatal编程技术网

Java 通过反转列表找到两个列表的合并点

Java 通过反转列表找到两个列表的合并点,java,data-structures,merge,linked-list,nodes,Java,Data Structures,Merge,Linked List,Nodes,问题陈述: 您将获得指向在某个节点合并在一起的两个链表的头节点的指针。查找发生此合并的节点。这两个头部节点将不同,并且都不为空 输入格式 您必须完成int FindMergeNodeNode*headA,Node*headB方法,该方法需要两个参数——链表的头。您不应该从stdin/console读取任何输入 输出格式 查找两个列表合并的节点并返回该节点的数据。不要将任何内容打印到标准输出/控制台 我试图反转这两个列表,然后分别遍历它们,直到到达最后一个公共节点。但是当测试时,它没有给出正确的输

问题陈述: 您将获得指向在某个节点合并在一起的两个链表的头节点的指针。查找发生此合并的节点。这两个头部节点将不同,并且都不为空

输入格式 您必须完成int FindMergeNodeNode*headA,Node*headB方法,该方法需要两个参数——链表的头。您不应该从stdin/console读取任何输入

输出格式 查找两个列表合并的节点并返回该节点的数据。不要将任何内容打印到标准输出/控制台

我试图反转这两个列表,然后分别遍历它们,直到到达最后一个公共节点。但是当测试时,它没有给出正确的输出。 是我的想法错了还是我的代码错了?这是一个好方法还是一个坏方法

我的代码:

 int FindMergeNode(Node headA, Node headB) {

//Reverse listA
Node currentA = headA;
Node prevA = null;
Node NextA;
while(currentA!=null){
   NextA = currentA.next;
   currentA.next = prevA;
   prevA = currentA;
   currentA = NextA;
}
headA = prevA;

//Reverse listB
Node currentB = headB;
Node prevB = null;
Node NextB;
while(currentB!=null){
   NextB = currentB.next;
   currentB.next = prevB;
   prevB = currentB;
   currentB = NextB;
}
headB = prevB;

//Iterate throught the reversed list and find the last common node.
Node n = headA;
Node m = headB;
while(n.next!=m.next){
    n = n.next;
    m = m.next;
}

return n.data;
}
问题链接:

编辑:根据karthik的回答,我修改了第三个while循环,但它仍然给出了错误的输出

 //Iterate throught the reversed list and find the last common node.
 Node n = headA;
 Node m = headB;
 while(n.next == m.next){
    n = n.next;
    m = m.next;
}

return n.data;
编辑:你应该更清楚地解释。因为“合并”是指值的合并,所以反向方法是有效的。但是,如果您的意思是合并实际节点,那么显然反转方法不起作用,因为当您反转列表时,合并点只能有下一个指针

  A->B->C  
          \
            I->J->K
          /
     X->Y
如果这是你的列表,当你反转的时候,你肯定不能把C和Y都作为你的下一个指针,因为当你反转的时候,你的树会变成

              A<-B<-C
                       I<-J<- K
                X <-Y
下面的解释回答了您原来的问题

我没有检查您的反转列表逻辑,但是在第三个while循环之后,您的while循环肯定是错误的:

  while(n.next!=m.next){  
     n = n.next;
     m = m.next;
 }
要点是-它应该是n.next==m.next


因为您希望找到第一个不同的节点并返回上一个节点。

我也有这个问题,我的最快解决方案是:

int FindMergeNode(Node headA, Node headB) {
    int s1 = getSize(headA), s2 = getSize(headB);
    for(int i = 0; i<Math.abs(s1-s2); i++){
        if(s1>s2) headA = headA.next;
        else headB = headB.next;
    }
    while(headA!=null){
        if(headA==headB) return headA.data;
        headA = headA.next;
        headB = headB.next;
    }
    return 0;

}
int getSize(Node head){
    int i = 0;
    while(head!=null){ 
        head = head.next;
        i++;
    }
    return i;
}

No.*不是java语法,可能是C还是C++程序?如果是,请更改标记谢谢,但不要更改。我修正了第三个while循环,但它仍然给出了错误的输出。我已经给出了这个问题的链接。我喜欢你的方法更简单,比我的好。谢谢。@Charan是的,它不起作用,因为你的方法不正确,你应该把问题解释得更清楚一点。我编辑了答案,检查一下。
  // ideally you should also check (n!=null && m!=null) 
  // it handles the case where there is no common point
  while(n!=null && m!=null && n.next == m.next){
     n = n.next;
     m = m.next;
 }
 return (n == null || m == null)? null : n;
int FindMergeNode(Node headA, Node headB) {
    int s1 = getSize(headA), s2 = getSize(headB);
    for(int i = 0; i<Math.abs(s1-s2); i++){
        if(s1>s2) headA = headA.next;
        else headB = headB.next;
    }
    while(headA!=null){
        if(headA==headB) return headA.data;
        headA = headA.next;
        headB = headB.next;
    }
    return 0;

}
int getSize(Node head){
    int i = 0;
    while(head!=null){ 
        head = head.next;
        i++;
    }
    return i;
}