链表: 链表相加

43 阅读1分钟

image.png

方法

  • 将两个链表翻转
  • 进行按位相加
  • 生成新的链表

  function ListNode(x){
    this.val = x;
    this.next = null;
  }

/* 反转链表 */
function reserve(head) {
    if(!head || !head.next) return head;
    let pre = null;
    let cur = head;
    
    while(cur) {
        const curNext = cur.next;
        cur.next = pre;
        pre = cur;
        cur = curNext
    }
    return pre;
}
/**
 * 
 * @param head1 ListNode类 
 * @param head2 ListNode类 
 * @return ListNode类
 */
function addInList( head1 ,  head2 ) {
     if(head1 == null) return head2;
     if(head2 == null) return head1;
    
    let pHead1 = reserve(head1);
    let pHead2 = reserve(head2);
    let flag = 0; // 标志进位
    
    const newHead1 = new ListNode(-1);
    let curNode = newHead1 // 新的链表
    
    while(pHead1 || pHead2) {
        const v1 = pHead1 ? pHead1.val : 0;
        const v2 = pHead2 ? pHead2.val : 0;
        const sum = v1 + v2 + flag; // 相加总和
        const result =  sum % 10; // 具体的值
        flag = Math.floor(sum/10);
        
        curNode.next = new ListNode(result);
        curNode = curNode.next;
        
        pHead1 = pHead1 ? pHead1.next : null;
        pHead2 = pHead2 ? pHead2.next : null;
    }
    
    // 若循环后,进位还有值,需要加上
    if(flag > 0) {
        curNode.next = new ListNode(flag);
    }
    
    return reserve(newHead1.next)
}