【发布时间】:2016-01-25 11:25:49
【问题描述】:
我写了一个方法来合并两个排序的链表(LL 是升序的)。通过使用双指针,我将头指针的地址从调用函数(main)传递给被调用函数(mergeSortedLL)。
//definition of listNode
struct ListNode{
int data;
struct ListNode *next;
};
void mergeSortedLL(struct ListNode **headA,struct ListNode *prevA,struct ListNode **headB,struct ListNode *prevB)
{
struct ListNode *currA=*headA,*currB=*headB;
static struct ListNode *finalHead=NULL;
// Base Condition
if(!currA || !currB)
{
*headA=finalHead; // this should change head in main function
printList(*headA); // LINE-1 this function prints data of linked list sequentially.
return;
}
struct ListNode *nextA=currA->next, *nextB=currB->next;
if(currA->data>currB->data)
{
if(!finalHead)
finalHead=currB; // finalhead points to head of that LL which starts with smaller value node
currB->next=currA;
if(prevB)
prevB->next=currB;
mergeSortedLL(&currA,currB,&nextB,currB);
}
else
{
if(!finalHead)
finalHead=currA; //finalhead points to head of that LL which starts with smaller value node
currA->next=currB;
if(prevA)
prevA->next=currA;
mergeSortedLL(&nextA,currA,&currB,currA);
}
}
在主函数中我创建了两个 LL
head==> -1->3->5->6->8->9 第一个节点是 -1
head2==> 0->1->4->5->7->8->9
并在从 main 调用之后
mergeSortedLL(&head,NULL,&head2,NULL);
printList(head); //Line-2
我无法预测的是,mergeSortedLL 函数的第 1 行总是打印所需的排序 LL,而 main 中第 2 行的 printList 方法有时需要传递 head,有时需要传递 head2 以获得所需的输出 (0113455678899)。
例如,如果第一个 LL 更改为 head==> 1->3->5->6->8->9,(第一个节点为正 1)第 2 行需要传递 head2 而不是 head 以获得所需的 o/p。
它是如何通过双指针 headA 在 mergeSoretedLL 方法中发生的,我将(主函数的)头更改为指向 finalHead。
我认为 headA 和 headB 的值不知何故被交换了,但我在这里看不到它。
有人请解释一下。
【问题讨论】:
-
如果没有调试器 IMO 很难弄清楚
-
你在这里使用递归是为了自己的目的(即学习)吗?否则我会建议在这里使用迭代。它更容易实现和理解(即更不容易出错),性能更高,节省(堆栈)内存空间。
-
是的,我也知道其他看起来并不复杂的解决方案。但我担心的是,当第 1 行给出正确的结果而 headA 持有 head 的引用(从 main 传递)时,为什么 main 中的第 2 行没有给出相同的结果。
-
确保在第一个递归级别中,将 headA 分配给预期节点的地址。看我的回答
标签: c pointers recursion linked-list