我写了一个方法将两个已排序的链表(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
头==> -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函数的第1行始终打印所需的已排序LL,而main中第2行的printList方法有时需要head
传递,有时head2
到通过获得所需的输出(0113455678899)
例如,如果第一个LL更改为head==> 1->3->5->6->8->9
,(第一个节点为正1)第2行需要传递head2而不是head来获得所需的o / p。
如何通过双指针头在mergeSoretedLL方法中发生这种情况我将头部(主要功能)更改为指向finalHead。
我认为headA和headB的某些值会被交换,但我无法在这里看到它。
有人请解释一下。
答案 0 :(得分:1)
您需要指定:
*headA=finalHead;
在if和else语句中也是。如下所示:
if(!finalHead) { // in if case
finalHead=currB;
*headA = finalHead;
}
...
...
if(!finalHead) { // in else case
finalHead=currA;
*headA = finalHead;
}
这是因为当你从main调用时,currA和CurrB不是NULL,因为* headA和* headB不是NULL。因此,如果或者基于currA->data > currB->data
的语句是真的,您的代码就会输入。在这里,您将finalHead指定为currA或currB,但是,这不会反映在* headA(head in main)中。所以,显然当你从main打印时,你不会得到结果。
因此,请确保在第一个递归级别中,将headA分配给目标节点的地址。