2018/12/14日:两数之和

(1)给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)

输出:7 -> 0 -> 8

原因:342 + 465 = 807

解题思路:遍历链表依次相加(遍历链表利用非空,.next进行指针移动)

注意问题:(1)链表为空的时候,数值为0 (2)carry数值是/不是取余,10+9=19,表示的进位,sum代表的数值的个位需要取余运算(3)当链表长度不一样的时候,最后可能发生进位。1+9=10的情况;

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//         创建一个ListNode用来返回和的链表
       ListNode head = new ListNode(0);
        //p->l1链表的头部,代表链表的index 表示链表的实时位置
       ListNode p = l1 , q = l2,current = head;
       int carry = 0; //代表进位的位数;
        //遍历链表,由于链表的长度不确定,所以||确定每个链表都可以遍历万,避免链表长度不一致;
       while(p!=null || q!=null){
           //不为空的时候取出链表的数值,当链表到达底部的时候有一个链表可能为空,数值为0;
           int x = (p!=null)?p.val:0;
           int y = (p!=null)?p.val:0;
           int sum = 0; //初始化和为0
           sum = (x+y+carry)%10; //sum的和等于两数的和, 7+8 = 15 只留下5 其余的进位
           carry = (x+y)/10; //carry和放在后面更新,首次的时候carry数值为0,15/10=1.5 进位进1,10+9=19/10 =1,9/10=0;
           current.next = new ListNode(sum); //sum数值存入到链表里面,
           current= current.next;
           //指针指向下一个位置
           if(p!=null) p = p.next;
           if(q!=null) q = q.next;
           
           
       }  
        //遍历万的数值;
      if (carry > 0) { //考虑最后链表遍历玩还有数值的情况
        current.next = new ListNode(carry);
     }
        return head.next;
    }
}

  

猜你喜欢

转载自www.cnblogs.com/love-life-insist/p/10120379.html