У меня есть два связанных списка, представляющих цифры десятичных чисел в порядке от наиболее значимого до наименее значимого. например, для 4-> 7-> 9-> 6
и 5-> 7
Ответ должен быть 4-> 8-> 5-> 3
без переворачивания списков, потому что реверсирование списков приведет к снижению эффективности.
Я подумываю решить проблему с помощью стека. Я буду перемещаюсь по обоим спискам и помещаю элементы данных в два отдельных стека. по одному для каждого связанного списка. Затем я складываю оба стека вместе и складываю оба элемента, и если результатом является двузначное число нет I 10 по модулю, и сохраняю перенос в временная переменная. Остаток сохраняется в узле, перенос добавляется к следующей сумме и так далее. если два стека - s1 и s2, а связанный список результатов - res.
temp = 0;
res = (node*)(malloc(sizeof(node*));
while(s1->top!=-1 || s2->top!=-1)
{
temp = 0;
sum = pop(s1) + pop(s2);
n1 = (node*)(malloc(sizeof(node*));
temp = sum/10;
sum = sum%10;
sum = sum+temp;
n1->data = sum;
n1->next = res;
res = n1;
free n1;
//temp=0;
}
if((s1->top==-1)&&(s2->top==-1))
{
return res;
}
else if(s1->top==-1)
{
while(s2->top!=-1)
{
temp = 0;
sum = pop(s2);
sum = sum + temp;
temp = sum/10;
sum = sum%10;
n1 = (node*)(malloc(sizeof(node*));
n1->data = sum;
n1->next = res;
res = n1;
free n1;
}
}
else
{
while(s2->top!=-1)
{
temp = 0;
sum = pop(s2);
sum = sum+temp;
temp = sum/10;
sum = sum%10;
n1=(node*)(malloc(sizeof(node*));
n1->data = sum;
n1->next = res;
res = n1;
free n1;
}
}
return res;
Я сталкивался с этой проблемой много раз в вопросах интервью, но это лучшее решение, которое я мог придумать. Если кто-нибудь сможет предложить что-то более эффективное в c, я буду очень рад.