演算法: 核心問題是進製的操作:
1)不要忘記進製之後的哪乙個1;
2)不要忘記所有位都操作完了之後,最後的哪乙個進製1
變形題目的話,需要想辦法轉換成 題目1這種原子操作的題目。
題目 1: 兩數相加:
// 演算法: 核心問題是:進製的操作,// 1)不要忘記進製之後的哪乙個1;// 2)不要忘記所有位都操作完了之後,最後的哪乙個進製1/** * definition for singly-linked list. * type listnode struct */func addtwonumbers(l1 *listnode, l2 *listnode) *listnode if l2 == nil h := new(listnode) pre,res := h,h m, n := l1, l2 for m != nil && n != nil pre = res res.val = sum % 10 res.next = tmp res = res.next m = m.next n = n.next } for m != nil pre = res res.val = s % 10 res.next = tmp res = res.next m = m.next } for n != nil pre = res res.val = s % 10 res.next = tmp res = res.next n = n.next } if res.val == 0 return h}
執行結果:
題目 2: 兩數之和:
**實現:
// 演算法:實現方式與題目1一致,// 本題**相當於對題目1的解法做了乙個**層面的優化/** * definition for singly-linked list. * type listnode struct */func addtwonumbers(l1 *listnode, l2 *listnode) *listnode else tmp := listnode res.next = &tmp l1 = l1.next l2 = l2.next res = res.next } // 位數不同的兩個數的,高位數計算 var result *listnode if l1 != nil else if l2 != nil for result != nil else tmp := listnode res.next = &tmp result = result.next res = res.next } // 最後的進製 if r != 0 res.next = &tmp } return n.next}
執行結果:
題目 3 :兩數相加
執行結果:
兩數相加 鍊錶
給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 ...
兩煉表數相加
給出兩個非空的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照逆序的方式儲存的,並且它們的每個節點只能儲存一位數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 7 0 8 ...
鍊錶兩數相加
給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 ...