我编写了一种将两个排序的链表(LL升序)合并为一个方法。通过使用双指针,我将头指针的地址从调用函数(主)传递到了被调用函数(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
并从主打来
mergeSortedLL(&head,NULL,&head2,NULL);
printList(head); //Line-2
我无法预测的是mergeSortedLL函数的Line-1总是打印所需的排序LL,而main中Line-2的printList方法有时需要传递
head
,有时需要传递head2
以获得所需的输出( 0113455678899)。例如,如果第一个LL更改为
head==> 1->3->5->6->8->9
,(第一个节点为正1),第2行要求传递head2而不是head以获得所需的o / p。像在mergeSoretedLL方法中一样,它是如何通过双指针headA发生的,我正在将head(主函数)更改为指向finalHead。
我认为以某种方式交换了headA和headB的值,但是我在这里看不到它。
有人请解释一下。
最佳答案
您需要分配:
*headA=finalHead;
在if and else语句中也是如此,即如下所示:
if(!finalHead) { // in if case
finalHead=currB;
*headA = finalHead;
}
...
...
if(!finalHead) { // in else case
finalHead=currA;
*headA = finalHead;
}
这是因为当您从main调用时,因为* headA和* headB不为NULL,所以currA和CurrB不为NULL。因此,您的代码将输入基于
currA->data > currB->data
的else语句是否为true。在这里,您可以将finalHead分配给currA或currB,但是这不会反映在* headA(main中的head)中。因此,很明显,当您从main打印时,不会得到结果。因此,请确保在第一个递归级别中,将headA分配给了预期节点的地址。
关于c - 无法使用指向该变量的指针来更改其他函数中的局部变量的状态,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34991436/