我正在hackerrank上查找此查找合并节点方法。我的方法是:当两个节点都不为空时,我想将其中一个列表移动到它们的下一个节点,这就是标志变量的用途。但不知怎的,它给了我分段错误?我是否偶然访问了一个null变量?有人请赐教。下面是我的方法代码。
约束:两个列表都会收敛,两个列表都是非NULL
$ export LC_ALL=pt_PT.utf8
$ export LANG="$LC_ALL"
答案 0 :(得分:3)
你做了两个假设:
1.存在这样的节点
2.此节点距每个列表开头的距离在两个列表之间最多相差1。您可以在一个列表中交替前进,然后检查是否到达同一节点(按地址)。因此,如果list1在您要查找的节点之前没有节点,并且list2之前有2个节点,则您将找不到匹配项。
如果我正确理解你的问题,事实是距离列表末尾的距离是相同的(因为它们的尾巴是相同的)。
答案 1 :(得分:1)
为什么直接使用flag使用条件来检查它是否是最后一个节点
if(headA->next ==NULL)
headA=headA->next;
else if (headB->next== NULL )
headB=headB->next;
完整的解决方案将是
int FindMergeNode(Node *headA, Node *headB) {
Node *currentA = headA;
Node *currentB = headB;
//Do till the two nodes are the same
while(currentA != currentB){
//If you reached the end of one list start at the beginning of the other one
//currentA
if(currentA->next == NULL){
currentA = headB;
}else{
currentA = currentA->next;
}
//currentB
if(currentB->next == NULL){
currentB = headA;
}else{
currentB = currentB->next;
}
}
return currentB->data;
}