一、題目名稱java
Add Two Numbers (兩個鏈表逐項作帶進位的加法生成新鏈表)
node
二、題目地址git
https://leetcode.com/problems/add-two-numbers/
code
三、題目內容ip
英文:You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.leetcode
中文:給定兩個鏈表,其中的元素都是非負整數。將兩個鏈表的對應位置相加,若是兩數相加須要進位,則將進位帶到下一組加法。返回相加後的新鏈表。開發
例如:給出的鏈表爲(2 -> 4 -> 3)和(5 -> 6 -> 4),則返回的結果爲:7 -> 0 -> 8get
四、解題方法1it
我最開始的思路是,設兩個鏈表爲l1和l2,則依次向後遍歷兩鏈表。每次遍歷都須要考慮如下三點:io
一、考慮l1和l2有一個鏈表裏對應位置爲空的狀況
二、考慮新鏈表根節點和非根節點的狀況
三、考慮進位的狀況
一段實現此方法的Java代碼以下:
/** * 功能說明:LeetCode 2 - Add Two Numbers * 開發人員:Tsybius * 開發時間:2015年8月27日 */ public class Solution { /** * 將兩個鏈表逐項相加,生成一個新鏈表,每次相加和大於10則進位到下一項 * @param l1 鏈表1 * @param l2 鏈表2 * @return 新鏈表 */ public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode listNodeRoot = null; ListNode listNodeCurr = listNodeRoot; int carry = 0; while (l1 != null || l2 != null) { //須要考慮l1和l2有一個爲空的狀況 int sum = 0; if (l1 != null) { sum += l1.val; } if (l2 != null) { sum += l2.val; } sum += carry; //須要考慮根節點和非根節點的狀況 if(listNodeRoot == null) { listNodeCurr = new ListNode(sum); listNodeRoot = listNodeCurr; } else { listNodeCurr.next = new ListNode(sum); listNodeCurr = listNodeCurr.next; } //須要考慮進位的狀況 carry = 0; while (listNodeCurr.val >= 10) { listNodeCurr.val -= 10; carry += 1; } //向後遍歷 if(l1 != null) { l1 = l1.next; } if(l2 != null) { l2 = l2.next; } } //考慮最後一次相加存在進位的狀況 if (carry > 0) { listNodeCurr.next = new ListNode(carry); } return listNodeRoot; } }
不事後來又寫出了更簡潔的代碼,下面這段Java代碼的大體思路與以前代碼一致,但減小了判斷,提升了效率。
/** * 功能說明:LeetCode 2 - Add Two Numbers * 開發人員:Tsybius * 開發時間:2015年8月27日 */ public class Solution { /** * 將兩個鏈表逐項相加,生成一個新鏈表,每次相加和大於10則進位到下一項 * @param l1 鏈表1 * @param l2 鏈表2 * @return 新鏈表 */ public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode listNodeRoot = new ListNode(0); ListNode listNodeCurr = listNodeRoot; int carry = 0; while (l1 != null || l2 != null || carry != 0) { //須要考慮l1和l2有一個爲空的狀況 int sum = (l1 != null ? l1.val : 0) + (l2 != null ? l2.val : 0) + carry; //計算當前位和進位 listNodeCurr.next = new ListNode(sum % 10); carry = sum / 10; //向後遍歷 listNodeCurr = listNodeCurr.next; l1 = (l1 != null ? l1.next : null); l2 = (l2 != null ? l2.next : null); } return listNodeRoot.next; } }
附:使用JavaScript語言實現的解題代碼(2016年1月23日加入)
/** * @param {ListNode} l1 鏈表1 * @param {ListNode} l2 鏈表2 * @return {ListNode} 將兩個鏈表逐項相加,生成一個新鏈表,每次相加和大於10則進位到下一項 */ var addTwoNumbers = function(l1, l2) { var root = new ListNode(0); var curr = root; var carry = 0; while (l1 !== null || l2 !== null || carry !== 0) { var sum = (l1 !== null ? l1.val : 0) + (l2 !== null ? l2.val : 0) + carry; curr.next = new ListNode(sum % 10); carry = Math.floor(sum / 10); curr = curr.next; l1 = (l1 !== null ? l1.next : null); l2 = (l2 !== null ? l2.next : null); } return root.next; };
END