ps:題目來自力扣
給你兩個?非空?的鏈表,表示兩個非負的整數。它們每位數字都是按照?逆序?的方式存儲的,并且每個節點只能存儲?一位?數字。
請你將兩個數相加,并以相同形式返回一個表示和的鏈表。
你可以假設除了數字 0 之外,這兩個數都不會以 0?開頭。
class Solution {// 該方法用于將兩個逆序存儲數字的鏈表相加,并返回表示和的鏈表public ListNode addTwoNumbers(ListNode l1, ListNode l2) {// 初始化結果鏈表的頭節點和尾節點,初始值都為 nullListNode head = null, tail = null;// 用于記錄進位,初始值為 0int carry = 0;// 只要 l1 或者 l2 還有節點,就繼續進行相加操作while (l1 != null || l2 != null) {// 如果 l1 不為空,取其節點值,否則為 0int n1 = l1 != null ? l1.val : 0;// 如果 l2 不為空,取其節點值,否則為 0int n2 = l2 != null ? l2.val : 0;// 計算當前位的和,包括之前的進位int sum = n1 + n2 + carry;// 如果結果鏈表還沒有頭節點,說明是第一次創建節點if (head == null) {// 創建一個新節點,值為 sum 對 10 取余的結果// 同時將頭節點和尾節點都指向這個新節點head = tail = new ListNode(sum % 10);} else {// 如果結果鏈表已經有頭節點,創建一個新節點,值為 sum 對 10 取余的結果// 并將這個新節點連接到尾節點的后面tail.next = new ListNode(sum % 10);// 尾節點移動到新創建的節點tail = tail.next;}// 更新進位,sum 除以 10 的商作為新的進位carry = sum / 10;// 如果 l1 不為空,將 l1 指針移動到下一個節點if (l1 != null) {l1 = l1.next;}// 如果 l2 不為空,將 l2 指針移動到下一個節點if (l2 != null) {l2 = l2.next;}}// 當 l1 和 l2 都遍歷完后,如果還有進位if (carry > 0) {// 創建一個新節點,值為進位的值// 并將這個新節點連接到尾節點的后面tail.next = new ListNode(carry);}// 返回結果鏈表的頭節點return head;}
}// 定義鏈表節點類
class ListNode {int val;ListNode next;// 無參構造函數ListNode() {}// 帶一個參數的構造函數,用于初始化節點的值ListNode(int val) { this.val = val; }// 帶兩個參數的構造函數,用于初始化節點的值和指向下一個節點的引用ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}