2個非空鍊錶相加

2021-10-01 17:43:54 字數 2378 閱讀 3616

2個非空鍊錶相加,裡面的元素都是int型別,

比如  (3->4->1) + (1->2) ,返回4->6->1. 第一位是最低位

面試官想要的思路,在鍊錶中挨個處理單個元素,需要注意進製的情況.考察下鍊錶的熟練程度和特殊情況的處理.

// 在鍊錶中處理,挨個處理每個元素,需注意進製,和最後一位進製的情況,

// 效率上略高,o(最長的鍊錶)但是讀起來沒有第一種好理解

class solution

guard l2 != nil else

// 佔位節點,方便書寫**

let result = listnode.init(0)

var worknode = result

var overflow = 0 // 是否有進製標誌

下面還有乙個類似的題目, 

2個非空鍊錶相加,裡面的元素都是int型別,

比如  (3->4->1) + (1->2) ,返回3->5->3,

這個題目和上面有點小不同, 把第一位認為是最高位, 可以用2個棧儲存鍊錶, 然後同時pop,這個可以保證pop出來的是同一位, 加出來的結果也加入到乙個棧中, 然後在把結果棧轉成鍊錶返回即可.

發現竟然不是100%, 後續看了看其他人的**, 確實存在優化的空間, 最後乙個結果棧, 其實是沒有必要的, 可以一邊計算出結果,一邊生成結果鍊錶. 這樣操作後可以節省一次迴圈的時間, 優化後就是超過100%了 

var result : listnode!

var temp : listnode!

var overflow = 0

while firstarray.count > 0 || secondarray.count > 0 || overflow != 0

temp = result

}

return result

除了常規解法, 還可以這樣,遍歷把鍊錶中的資料用乙個真正的int表示出來, 然後2個int相加的結果為sum,在把sum轉成乙個鍊錶輸出.這個方案不用考慮那麼多細節,進製啊,最後一位超出了處理啊統統不需要考慮. 簡單直接, 但是慢一點點,而且不能處理超大數,不論是用處long還是int,對於位數過多的數字總是能超出使用範圍導致無法處理的, 這個當然是無法通過測試用例的, 給出第一位是最低位的解法.

// 把鍊錶的資料轉出來,然後處理,需要o(m+n+最長的鍊錶)

void fun1()

nslog(@"%@",result);

}

leetcode 2鍊錶相加

給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 ...

leetcode 鍊錶相加

給定兩個用鍊錶表示的整數,每個節點包含乙個數字。這些數字是反向存放的,也就是個位排在鍊錶首部。編寫函式對這兩個整數求和,並用鍊錶形式返回結果。示例 輸入 7 1 6 5 9 2 即617 295 輸出 2 1 9,即912 採用原地演算法,比較兩個鍊錶長度,如果長度一致,那麼鍊錶相加到任一鍊錶,計算...

Leetcode NO 2 兩數相加 鍊錶相加

給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 ...