博客 / 詳情

返回

[leetcode]2. 兩數相加

兩數相加

leetcode題目地址

解題源碼及測試

題目

給你兩個非空的鏈表,表示兩個非負的整數。它們每位數字都是按照逆序的方式存儲的,並且每個節點只能存儲一位數字。

請你將兩個數相加,並以相同形式返回一個表示和的鏈表。

你可以假設除了數字 0 之外,這兩個數都不會以 0  開頭。

  • 示例 1:
輸入:l1 = [2,4,3], l2 = [5,6,4]
輸出:[7,0,8]
解釋:342 + 465 = 807.
  • 示例 2:
輸入:l1 = [0], l2 = [0]
輸出:[0]
  • 示例 3:
輸入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
輸出:[8,9,9,9,0,0,0,1]

提示:

  • 每個鏈表中的節點數在範圍 [1, 100] 內
  • 0 <= Node.val <= 9
  • 題目數據保證列表表示的數字不含前導零

解答

遍歷兩個兩個鏈表,有值取值,無值取 0;由於一個節點只保存一位數字,因此不會>10

因此只有兩種情況,>=10時進位,<10直接賦值;這裏用一個變量去記錄是否有進位,如果有,下一次計算時+1,這裏直接用Number(flag)的形式偷了個懶。

移動 move 指針,並對 next 創建 ListNode 節點;這裏需要判斷是否新增最後一個節點。當最後兩個節點數相加沒有進位時,不需要增加,>10時才增加,此時 val = 1。

export class ListNode {
  val: number;
  next: ListNode | null;
  constructor(val?: number, next?: ListNode | null) {
    this.val = val === undefined ? 0 : val;
    this.next = next === undefined ? null : next;
  }
}

export function addTwoNumbers(
  l1: ListNode | null,
  l2: ListNode | null
): ListNode | null {
  let sum = 0;
  const result = new ListNode(0, null);
  let move = result;
  let flag = false;

  while (l1 || l2) {
    sum = (l1?.val ?? 0) + (l2?.val ?? 0) + Number(flag);
    if (sum >= 10) {
      move.val = sum % 10;
      flag = true;
    } else {
      move.val = sum;
      flag = false;
    }
    l1 && (l1 = l1.next);
    l2 && (l2 = l2.next);
    if (l1 || l2 || flag) {
      move = move.next = new ListNode(Number(flag), null);
    }
  }

  return result;
}
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.