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