題目**,
原題:兩個單鏈表(singly linked list),每乙個節點裡面乙個0-9的數字,輸入就相當於兩個大數了。然後返回這兩個數的和(乙個新list)。這兩個輸入的list長度相等。 要求是:不用遞迴;
要求演算法在最好的情況下,只遍歷兩個list一次 ,最差的情況下兩遍
分析:如果鍊錶表示的數是從低到高位表示的,則很簡單;如果是從高到低,問題就複雜了,進製是萬惡之源。
兩個單鏈表,每個節點儲存乙個0-9的數字,那麼乙個單鏈表就表示乙個大數。 從高位到低位存,即表頭對應的是這個大數的最高位。兩個鍊錶的長度相等, 我們要返回乙個新的單鏈表,是這兩個輸入鍊錶代表的數的和。我們不能使用遞迴, 不能使用額外的儲存空間,即空間複雜度是o(1)。只遍歷輸入鍊錶一次, 輸出鍊錶也是單鏈表(沒有前向指標)。
既然只能遍歷兩個輸入鍊錶一次,那我們就從高位加起唄。在這種限制條件下, 這是唯一的出路。然後呢?進製咋整?先加高位,再加低位, 低位產生的進製怎麼加到高位去?我們可沒有前向指標哦親。既然沒有前向指標, 我們就讓乙個臨時指標指向高位,當低位相加產生進製時,我們就可以操作高位了。 讓我們看看圖示:
輸入鍊錶1:
123輸入鍊錶2:
128輸出鍊錶:24
兩個指標:
p q
當指向輸出鍊錶當前結點的指標q發現3+8=11,產生進製,指向高位的p就將結點值加1。 注意,兩個0-9的數相加,要麼不進製,要麼進製為1,只有兩種情況。因此, 我們不用考慮進製是其它數,這一點很重要,後面會看到的。這樣就ok了嗎?當然不是,如果你遇上連續進製,怎麼破?請看下面的情況:
輸入鍊錶1:
1234
5輸入鍊錶2:
1765
9
顯然,指向高位的指標p總是緊跟著指向當前結點的指標q是不行的, 這樣當遇上連續進製時,比p更高位的位也需要改變。既然p不能緊跟著q, 我們就不讓它們緊挨著,給它們產生點距離。考慮一下,什麼情況下會產生連續進製? 9! 嗯,遇上9的時候。它要連續進製到哪一位?不為9的那一位。因此,指標p 要停留在和不為9的那一位上,看圖示:
輸入鍊錶1:
1234
5輸入鍊錶2:
1765
9輸出鍊錶:29
99兩個指標:
p q
這回當q發現,需要進製了,只需要把p所指結點加1,然後把p,q間的結點都置0即可。 為什麼都置0了呢,因為進製只可能是1,9+1=10,留在該位的自然是0了。分析完畢,這種方法在任何時候都只需要遍歷輸入鍊錶一次,空間複雜度o(1)。具體**如下:
#include#includeusing namespace std;
struct node
};node* addlinklist(node* head1,node* head2)
else if(sum < 9)q = p;//可能會有進製的節點修改為p
p1 = p1->next;
p2 = p2->next;
} if(head->val > 9)
return head;
}node* makelinkedlist(int* data,int n)
return head;
}void print(node* head)
coutnext);
delete head;
head = null;
}int main()
{ int n,i;
node* head1,*head2;
cout << "----------輸入每個鍊錶的長度---------"<> n)
{ int* data = new int[n];
cout <<"-------輸入第乙個鍊錶的元素------"<> data[i];
head1 = makelinkedlist(data,n);
cout <<"-------第乙個鍊錶為-------------"<> data[i];
head2 = makelinkedlist(data,n);
cout <<"-------第二個鍊錶為-------------"<
待字閨中之雞蛋挺住體
題目 兩個軟硬程度一樣但未知的雞蛋,它們有可能都在一樓就摔碎,也可能從一百層樓摔下來沒事。有座100層的建築,要你用這兩個雞蛋通過最少的次數確定哪一層是雞蛋可以安全落下的最高位置。可以摔碎兩個雞蛋 方法分析 看到這個題目,最保險的方法就是一層一層試驗,但這樣只需要乙個雞蛋就可以了。我們現在有兩個雞蛋...
待字閨中之巧妙排序分析
排序只有1,2,3三個元素的陣列,不能統計1,2,3的個數。分析 這個題目,儘管也是排序,但卻不能使用快速排序的方法。只有三個元素,如果時間複雜度仍舊是o nlogn 顯然不是最好的。那就可以使用線性的排序演算法,例如計數排序,可是題目中要求,不能夠對1,2,3進行統計個數。那該如何處理呢?請大家看...
待字閨中之巧妙排序分析
排序僅僅有1。2,3三個元素的陣列。不能統計1,2。3的個數。分析 這個題目,雖然也是排序,但卻不能使用高速排序的方法。僅僅有三個元素,假設時間複雜度仍舊是o nlogn 顯然不是最好的。那就行使用線性的排序演算法,比如計數排序。但是題目中要求,不可以對1,2,3進行統計個數。那該怎樣處理呢?請大家...