演算法 單鏈表之和

2021-06-15 07:12:31 字數 1179 閱讀 5395

今天看到 待字閨中 的一道演算法題:

兩個單鏈表,每乙個節點裡面乙個0-9的數字,輸入就相當於兩個大數了。然後返回這兩個數字的和(乙個新的list)。這兩個輸入的list長度相等。

要求: 1 不用遞迴 2 要求演算法的時間和空間複雜度盡量低

分析:0-9之間的數相加,最大的進製是1,如果只要求遍歷兩個鍊錶各1次,需要兩個指標輔助,乙個指標指向第乙個不是連續9的節點,第二個指標指向當前計算和的節點。為什麼要這樣設定指標?我們分情況來看:

case1: 

list1:   1 2 3 4 5

list2:   5 4 3 2 1

sum:  6 6 6 6 6

p,q這種情況是最簡單的,不產生進製,而且最高位也沒有進製

case2:

list1:    2  4  6  7  8

list2:    3  5  3  2  7

sum:   5  9  9  9  

p                q

這是最複雜的情況:連續的9,這時候一旦當前求和的節點(q)產生了進製,之前所有的9都需要被置為0,而連續9之前的位(p)需要+1,這就是為什麼要設定p在第乙個不是連續9的節點,如果碰到了q有進製,就把p的節點+1, 然後p和q之間的所有節點置為0;

case3:

list1:    2  4  2  7  8

list2:    3  5  3  2  7

sum:   5  9  5    

p       q

這是居中的情況:沒有連續的9,處理是當前的指標(q)得到的節點和為9時,p指標不動,如果q=q->next;之後,求得的節點指標小於9,即不可能產生進製,則把p指標指向當前的節點。

所有情況分析完畢,當然完事開頭難,因為很可能第一位個高位就產生了進製,亦或者從最高位開始出現連續的9,所以我的處理辦法是,只要第一位求和大於等於9,就建立兩個節點,第乙個節點儲存sum/10;第二個節點儲存sum%10;如果產生了進製也可以

listnode* sumtwolist(const listnode* list_1, const listnode* list_2)else

while(list_1->next!= null && list_2->next!= null)else }}

return head;

}

單鏈表演算法

遍歷 就是把單鏈表中的各個節點挨個拿出來,就叫遍歷 遍歷要點 不能遺漏,不能重複,追求效率 方法 從頭指標 頭節點 順著鍊錶掛接指標依次訪問鍊錶的各個節點,取出這個節點的資料,然後再往下乙個節點,知道最後乙個節點,結束返回 include include include 構建乙個鍊錶的節點 stru...

單鏈表演算法

設帶頭結點的非空單鏈表 l,設計乙個演算法刪除 l 中奇數序號 的結點,即刪除 l 中第 1 3 5 結點。應該是對的,唉,我也忘了 設計演算法刪除單鏈表奇數序號的節點 include include include define elemtype int typedef struct node l...

單鏈表全部演算法

本篇純粹體現鍊錶各種操作的具體 實現,採用了帶頭結點的單鏈表,廢話不多說,直接上 注釋 include include 鍊錶的結構 typedef struct lnode linklist 列印鍊錶 void showlinklist linklist l 初始化鍊錶,使指標指向頭結點 void ...