当前位置: 首页 > 知识库问答 >
问题:

通过反转列表来查找两个列表的合并点

曾明诚
2023-03-14

问题陈述:给你一个指针,指向在某个节点合并在一起的两个链表的头节点。找出这个合并发生的节点。这两个头节点将是不同的,并且都不会为空。

输入格式您必须完成int FindMergeNode(Node*head A, Node*head B)方法,该方法接受两个参数-链表的头。您不应该从标准输入/控制台读取任何输入。

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

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

我的代码:

 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;
}

问题链接:https://www . hacker rank . com/challenges/find-the-merge-point of-two-joined-linked-lists

编辑:从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;

共有2个答案

陈项禹
2023-03-14

我也从这里遇到这个问题和我最快的解决方案

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;
}
申自明
2023-03-14

编辑:你应该更清楚地解释你的解释。因为如果你指的是的合并,那么通过合并,反转方法有效。但是,如果您指的是实际节点的合并,显然反转方法不起作用,因为当您反转列表时,合并点只能有下一个指针。

  A->B->C  
          \
            I->J->K
          /
     X->Y

如果这是你的列表,当你反转的时候,你当然不能同时将< code>C和< code>Y作为你的下一个指针。因为当你反转时,你的树会变成

              A<-B<-C
                       I<-J<- K
                X <-Y

但您的I将指向Y

另一种更简单的方法(实现明智)是将节点推送到两个堆栈,一旦您完成所有节点,就开始poping元素并返回相同的最后一个节点。

 Stack<Node> stackA - push all elements of listA into stackA;
 Stack<Node> stackB - push all elements of listB into stackA;

 Node result=null;
 while(stackA.peek() == stackB.peek()){
    result = stackA.pop();
    stackB.pop();
 }
 return result;

下面的解释回答了您最初的问题

我没有检查你的反转列表逻辑,但是你的while循环之后(第3个时循环)肯定是错误的:

  while(n.next!=m.next){  
     n = n.next;
     m = m.next;
 }

主要的一点是,它应该是n。next=m.next

  // 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;

因为您要查找第一个不同的节点并返回前一个节点。

 类似资料:
  • rank ▲ ✰ vote url 65 357 50 683 url 合并两个列表 怎样合并两个列表? 例如: listone = [1,2,3] listtwo = [4,5,6] 我期待: mergedlist == [1, 2, 3, 4, 5, 6] 在Python中非常容易. mergedlist = listone + listtwo

  • 本文向大家介绍Python-通过在第一个列表中保留重复项来合并两个列表,包括了Python-通过在第一个列表中保留重复项来合并两个列表的使用技巧和注意事项,需要的朋友参考一下 在使用python进行数据分析时,我们可能会遇到需要合并两个列表的情况。但是处理这些列表中存在的重复元素可能是一个挑战。在本文中,我们将了解如何通过维护第一个列表中的所有元素以及仅第二个列表中的唯一元素来合并两个列表。 使用

  • 问题内容: 我有 我想要 问题答案:

  • 知乎远程面试要求编程 尾递归 def _recursion_merge_sort2(l1, l2, tmp): if len(l1) == 0 or len(l2) == 0: tmp.extend(l1) tmp.extend(l2) return tmp else: if l1[0] < l2[0]: tmp.append(l1[0])

  • 我有一个LegacyAcCountDto,我需要从两个不同的来源建立一个列表。一个是本地JPA存储库,另一个是Web服务调用。Web服务版本具有JPA数据源不可用的帐户状态。我需要并行执行两个调用,当它们都完成时,我需要找到Web服务列表的legacyId,并用从Web服务中提取的帐户状态填充列表。整个想法是返回一个包含完整DTO的列表。我不需要把它保存回网络服务或JPA回购 DTO: merge

  • 问题内容: 我正在尝试使用python中的列表理解来扁平化列表。我的清单有点像 只是为了打印,然后在此列表中的单个项目我写了这段代码 然后我使用相同的逻辑通过列表理解来整理列表,但出现以下错误 如何使用列表理解来展平这种类型的列表? 问题答案: 单线: 可读版本: 使用嵌套列表理解:(与相比要慢一些):