記錄下來怕自己忘記
問題描述:
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