单链表表示的大数相加问题
记录下来怕自己忘记 问题描述: 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |