兩數相加 給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。 如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。 您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。 示例: 輸入:(2 -> ...
兩數相加
給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/add-two-numbers
著作權歸領扣網路所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
演算法思路和官方相同,但就語句而言或許可以進一步優化
關鍵代碼:
ListNode result= new ListNode(0); //當前節點,進行迭代 ListNode head = result; //頭節點 int next = 0; //若相加大於10進位則next==1 while (l1 != null || l2 != null) { int value1, value2; if (l1 == null) //當l1或l2為空時,假設值為0 value1 = 0; else value1 = l1.val; if (l2 == null) value2 = 0; else value2 = l2.val; int temp = value1 + value2; result.val = temp + next; if (result.val < 10) //判斷是否進位 { next = 0; } else { result.val = result.val - 10; next = 1; } if (l1 != null) //l1和l2不為空時迭代 l1 = l1.next; if (l2 != null) l2 = l2.next; if (l1 == null && l2 == null) //同時為空時結束,避免下方語句進行使得結果錯誤 break; result.next = new ListNode(0); result = result.next; } if (next == 1) //出現進位但l1和l2下一數字都為0時上述迴圈無法進行,做特殊處理 { result.next = new ListNode(1); } return head;
完整代碼:
using System; namespace numAdd { public class ListNode { public int val; public ListNode next; public ListNode(int x) { val = x; } } class Program { public static ListNode AddTwonumbers(ListNode l1, ListNode l2) { ListNode result= new ListNode(0); //當前節點,進行迭代 ListNode head = result; //頭節點 int next = 0; //若相加大於10進位則next==1 while (l1 != null || l2 != null) { int value1, value2; if (l1 == null) //當l1或l2為空時,假設值為0 value1 = 0; else value1 = l1.val; if (l2 == null) value2 = 0; else value2 = l2.val; int temp = value1 + value2; result.val = temp + next; if (result.val < 10) //判斷是否進位 { next = 0; } else { result.val = result.val - 10; next = 1; } if (l1 != null) //l1和l2不為空時迭代 l1 = l1.next; if (l2 != null) l2 = l2.next; if (l1 == null && l2 == null) //同時為空時結束,避免下方語句進行使得結果錯誤 break; result.next = new ListNode(0); result = result.next; } if (next == 1) //出現進位但l1和l2下一數字都為0時上述迴圈無法進行,做特殊處理 { result.next = new ListNode(1); } return head; } static void Main(string[] args) //簡單測試 { ListNode l1 = new ListNode(9); l1.next = new ListNode(9); //l1.next.next = new ListNode(3); ListNode l2 = new ListNode(1); //l1.next = new ListNode(6); //l1.next.next = new ListNode(4); ListNode l3 = AddTwonumbers(l1, l2); while (l3 != null) { Console.WriteLine(l3.val); l3 = l3.next; } } } }
演算法
從最低一位開始相加,大於9則進位處理,直至到最後處理完成
以下特別情況要特別註意:
測試用例 | 說明 |
---|---|
l1=[0,1],l2=[0,1,2]l2=[0,1,2] | 當一個列表比另一個列表長時 |
l1=[],l2=[0,1]l2=[0,1] | 當一個列表為空時,即出現空列表 |
l1=[9,9],l2=[1]l2=[1] | 求和運算最後可能出現額外的進位,這一點很容易被遺忘 |