合并两个排序的链表
Merging two sorted linkedlists
我正在尝试编写一个程序来合并两个已排序的链接 lists.But 最后一个元素根本没有被插入。当尝试在 listA 中的最后一个节点之后插入一个节点时,代码似乎失败了。任何帮助将不胜感激。
/*
Merge two sorted lists A and B as one linked list
Node is defined as
struct Node
{
int data;
struct Node *next;
}
*/
Node* MergeLists(Node *headA, Node* headB)
{
// This is a "method-only" submission.
// You only need to complete this method
Node *prev;
Node *currentA=headA;
Node *currentB=headB;
Node *next;
if(headA==NULL)
{
return headB;
}
if(headB==NULL)
{
return headA;
}
while(currentA!=NULL && currentB!=NULL)
{
if(currentB->data < currentA->data)
{
Node *new_node=new Node;
new_node->data=currentB->data;
headA=new_node;
new_node->next=currentA;
currentA=new_node;
currentB=currentB->next;
}
else if(currentB->data > currentA->data && currentB->data < currentA->next->data)
{
Node *new_node=new Node;
new_node->data=currentB->data;
next=currentA->next;
prev=currentA;
new_node->next=next;
prev->next=new_node;
currentA=new_node;
currentB=currentB->next;
}
else
{
currentA=currentA->next;
}
if(currentA->next==NULL)
{
Node *new_node=new Node;
new_node->data=currentB->data;
prev=currentA;
prev->next=new_node;
new_node->next=NULL;
currentA=new_node;
currentB=currentB->next;
}
}
return headA;
}
输入:
1 (No of test cases)
2 (Length of list A)
2 4
4 (Length of list B)
1 3 5 7
预期输出:
1 2 3 4 5
实际输出:
Runtime error
我认为真正的问题在于您的输入。
1(测试用例数)
2(列表 A 的长度)
2 4
2(列表 B 的长度)
1 3 5
列表 B 的长度应为 3。正如您输入中提到的 2。您的输出仅包含列表 B 中的 2 个元素。
请检查正确输入如下:
1(测试用例数)
2(列表 A 的长度)
2 4
3(列表 B 的长度)
1 3 5
当代码到达列表 A 或列表 B 的末尾时,它缺少复制列表 A 或列表 B 的剩余部分的代码。我还想知道在设置 currentA = 后使用 currentA->next 进行检查currentA->next,可以为NULL。
代码也比较复杂,如果(currentB->data < currentA->data),你从list B中移动或复制一个节点,否则你从list A中移动或复制一个节点,就不需要复杂的 else if 在 if (currentB->data < currentA->data) 之后,只要 else 就足够了。
代码可以简化:
prev = NULL; /* this will be sorted list */
/* ... */
if(prev == NULL){ /* if first element */
prev = new_node;
next = new_node;
} else {
next->next = new_node;
next = new_node;
}
/* ... */
next->next = NULL; /* set end of list */
您可能要考虑将 prev 的名称更改为 head,将 next 更改为 tail。
通常,mergelists 函数将节点从列表 A 和列表 B 移动到排序的输出列表中,而不是创建节点副本列表。在这种情况下,将永远不会使用新节点,并且列表 A 和列表 B 中的现有节点将按顺序链接在一起。
我正在尝试编写一个程序来合并两个已排序的链接 lists.But 最后一个元素根本没有被插入。当尝试在 listA 中的最后一个节点之后插入一个节点时,代码似乎失败了。任何帮助将不胜感激。
/*
Merge two sorted lists A and B as one linked list
Node is defined as
struct Node
{
int data;
struct Node *next;
}
*/
Node* MergeLists(Node *headA, Node* headB)
{
// This is a "method-only" submission.
// You only need to complete this method
Node *prev;
Node *currentA=headA;
Node *currentB=headB;
Node *next;
if(headA==NULL)
{
return headB;
}
if(headB==NULL)
{
return headA;
}
while(currentA!=NULL && currentB!=NULL)
{
if(currentB->data < currentA->data)
{
Node *new_node=new Node;
new_node->data=currentB->data;
headA=new_node;
new_node->next=currentA;
currentA=new_node;
currentB=currentB->next;
}
else if(currentB->data > currentA->data && currentB->data < currentA->next->data)
{
Node *new_node=new Node;
new_node->data=currentB->data;
next=currentA->next;
prev=currentA;
new_node->next=next;
prev->next=new_node;
currentA=new_node;
currentB=currentB->next;
}
else
{
currentA=currentA->next;
}
if(currentA->next==NULL)
{
Node *new_node=new Node;
new_node->data=currentB->data;
prev=currentA;
prev->next=new_node;
new_node->next=NULL;
currentA=new_node;
currentB=currentB->next;
}
}
return headA;
}
输入:
1 (No of test cases)
2 (Length of list A)
2 4
4 (Length of list B)
1 3 5 7
预期输出:
1 2 3 4 5
实际输出:
Runtime error
我认为真正的问题在于您的输入。
1(测试用例数)
2(列表 A 的长度)
2 4
2(列表 B 的长度)
1 3 5
列表 B 的长度应为 3。正如您输入中提到的 2。您的输出仅包含列表 B 中的 2 个元素。
请检查正确输入如下:
1(测试用例数)
2(列表 A 的长度)
2 4
3(列表 B 的长度)
1 3 5
当代码到达列表 A 或列表 B 的末尾时,它缺少复制列表 A 或列表 B 的剩余部分的代码。我还想知道在设置 currentA = 后使用 currentA->next 进行检查currentA->next,可以为NULL。
代码也比较复杂,如果(currentB->data < currentA->data),你从list B中移动或复制一个节点,否则你从list A中移动或复制一个节点,就不需要复杂的 else if 在 if (currentB->data < currentA->data) 之后,只要 else 就足够了。
代码可以简化:
prev = NULL; /* this will be sorted list */
/* ... */
if(prev == NULL){ /* if first element */
prev = new_node;
next = new_node;
} else {
next->next = new_node;
next = new_node;
}
/* ... */
next->next = NULL; /* set end of list */
您可能要考虑将 prev 的名称更改为 head,将 next 更改为 tail。
通常,mergelists 函数将节点从列表 A 和列表 B 移动到排序的输出列表中,而不是创建节点副本列表。在这种情况下,将永远不会使用新节点,并且列表 A 和列表 B 中的现有节点将按顺序链接在一起。