2#两数相加
題目描述
2#兩數(shù)相加
給定兩個非空鏈表來表示兩個非負(fù)整數(shù)。位數(shù)按照逆序方式存儲,它們的每個節(jié)點(diǎn)只存儲單個數(shù)字。將兩數(shù)相加返回一個新的鏈表。
你可以假設(shè)除了數(shù)字 0 之外,這兩個數(shù)字都不會以零開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 輸出:7 -> 0 -> 8 原因:342 + 465 = 807分析
由于是兩個鏈表的元素對應(yīng)相加,很自然地就想到用雙指針,然后在雙指針的基礎(chǔ)上加一些進(jìn)位的操作滿足特殊情況。
1. 結(jié)果位數(shù)與有原鏈表相等
這是一種比較簡單的情況,原題中的測試用例就是這種。雖然在中間的某一位會有進(jìn)位,但是最高位之和比較小,不會產(chǎn)生進(jìn)位,最后的和的結(jié)果的位數(shù)也和兩個加數(shù)中較長的那個一致。
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8 Explanation: 342 + 465 = 807.這種情況的處理就比較簡單。新建一個鏈表,設(shè)置一個int型的變量carry來保存進(jìn)位的信息,使用兩個指針分別遍歷兩個鏈表,取出每一位的值(細(xì)節(jié):如果指針變?yōu)閚ull了,取出的值為0),依次在鏈表的尾部添加每一位的結(jié)果。
2. 結(jié)果位數(shù)與原鏈表不等
這種情況,最高位比較大,最后的結(jié)果會比兩個加數(shù)中較大的那個還多一位。
Input: (9 -> 9) + (1) Output: 0 -> 0 -> 1 Explanation: 99 + 1 = 100.在這種情況下,最后要多一步操作,判斷carry位是否為0,如果不為0,就要在結(jié)果鏈表的尾部再加一位。
源碼
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/ class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {int carry = 0;ListNode result = new ListNode(0);ListNode current = result;while (l1 != null || l2 != null){int x = (l1 != null)? l1.val : 0; // 取出對應(yīng)位的值int y = (l2 != null)? l2.val : 0;int sum = x + y + carry;current.next = new ListNode(sum % 10);carry = sum / 10; // 計算進(jìn)位if (l1 != null) l1 = l1.next;if (l2 != null) l2 = l2.next;current = current.next;}if (carry > 0) // 判斷是否需要多加一位current.next = new ListNode(carry);return result.next;} }轉(zhuǎn)載于:https://www.cnblogs.com/yuzhenzero/p/9626415.html
總結(jié)
- 上一篇: 第2章 数字之魅——快速寻找满足条件的两
- 下一篇: 计算本年 本月 本周的起始日期