我有两个链接列表,按从最高有效位到最低有效位的顺序表示十进制数的数字。例如,
我考虑使用堆栈来解决这个问题。我将遍历这两个列表,并将数据元素分别推入两个单独的堆栈中。一个用于每个链接列表。然后,我一起弹出两个堆栈,并添加两个元素。如果结果是两位数,则对10取模并将进位存储在临时变量中。余数存储在节点中,并将进位添加到下一个总和中,以此类推。如果两个堆栈是s1和s2,结果链接列表是res。
4->7->9->6
和 5->7
。答案应该是4->8->5->3
,而不需要翻转列表,因为翻转列表会导致效率降低。我考虑使用堆栈来解决这个问题。我将遍历这两个列表,并将数据元素分别推入两个单独的堆栈中。一个用于每个链接列表。然后,我一起弹出两个堆栈,并添加两个元素。如果结果是两位数,则对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语言提出更有效的解决方案,我将非常高兴。
(4->7->9->6) + (5->7)
转化成4->8->5->3
? - Dylan4796 + 57 == 4853
。 - Michael Burr