单链表表示的大数相加问题

记录下来怕自己忘记

问题描述:

2个单链表(singly linked list),每一个节点里面一个0-9的数字,输入就相当于两个大数了。然后返回这两个数的和(一个新list)。这两个输入的list 长度相等。 要求是:1. 不用递归。2. 要求算法在最好的情况下,只遍历两个list一次,最差的情况下两遍。

条件: 从高到低位存储大数。空间复杂度O(1)

记两个单链表分别为a,b; 长度为n  ,存储结构的单链表为c

分析:因为要求只能遍历list最多两次,且不能回头,所以只能是使用指针来记录因为进位而导致值更改的位置了~

a,b对应节点之和的情况只有3中,sum <9, sum = 9, sum >9

<9 时,直接赋值,当前指针pc前进,记录指针p也前进

= 9 时,要注意,意味着记录指针p不能移动(此时p指向的是<9的节点),pc前进

>9时,意味着要进位,从p到pc间的所有节点更新值。

因为进位而导致值修改,只能是值+1,此处安放一个指针。

 

伪代码如下:

//初始化一个单链表c,长度n+1 ,节点初始值为0#。。。。其实应该边算边new 节点的哈……

linkedlist  c = new linkedlist(n+1,0)

node * p = c.head, *pc = c.head

node * pa = a.head, *pb = b.head

pc = pc->next

while(pc)

     sum = pa->value +pb->value

     if  sum < 9

           pc->value = sum

           p = pc

           pc = pc->next

   else if sum ==9

           pc = pc->next

    else

            pc->value = sum%10

            p->value = p->value +1

            do                    

                    p = p->next

                    p->value = 0

             while(p->next != pc);

#endwhile         

if c.head->value ==0

       node *tmp = c.head

       c.head = c.head->next

       delete *tmp

 

 例如

a:    4   4  4   4   0

b:    5   5   5   8   1

c: x  9   9  9   12 

   p                 pc

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值