天天看點

LeetCode 445. 兩數相加 II

第一種:先反轉連結清單,計算和,再将計算後的結果進行反轉

const reverseListNode = (head) => {
  if(!head || !head.next) {
    return head;
  }
  let cur = head;
  let next = cur.next;
  cur.next = null;
  while(next) {
    let tmp = next.next;
    next.next = cur;
    cur = next;
    next = tmp;
  }
  return cur;
}
const addTwoNumbers = (l1, l2) => {
  let reverseL1 = reverseListNode(l1);
  let reverseL2 = reverseListNode(l2);
  let result = new ListNode(-1);
  let res = result;
  let count = 0;
  while(reverseL1 || reverseL2 || count) {
    let val1 = reverseL1 ? reverseL1.val : 0;
    let val2 = reverseL2 ? reverseL2.val : 0;
    const sum = count + val1 + val2;
    let tmp = sum % 10;
    count = sum >= 10 ? 1 : 0;
    result.next = new ListNode(tmp);
    result = result.next;
    if(reverseL1) {
      reverseL1 = reverseL1.next;
    }
    if(reverseL2) {
      reverseL2 = reverseL2.next;
    }
  }
  return reverseListNode(res.next);
}
           

第二種:使用棧

const addTwoNumbers = (l1, l2) => {
  const stack1 = [];
  const stack2 = [];
  while(l1){
    stack1.push(l1.val);
    l1 = l1.next;
  }
  while(l2){
    stack2.push(l2.val);
    l2 = l2.next;
  }
  let prev = null;
  let carry = 0;
  while(stack1.length || stack2.length || carry) {
    const val1 = stack1.length ? stack1.pop() : 0;
    const val2 = stack2.length ? stack2.pop() : 0;
    const sum = val1 + val2 + carry;
    carry = parseInt(sum / 10);
    const cur = new ListNode(sum % 10);
    cur.next = prev;
    prev = cur;
  }
  return prev;
}
           

來源

445. 兩數相加 II