單鏈表表示的大數相加問題

記錄下來怕自己忘記

問題描述:

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

發佈了42 篇原創文章 · 獲贊 13 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章