刷题记录——LeetCode: 2.两数相加

LeetCode:
2.两数相加

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

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

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
思路:链表存储为个位十位百位…,所以位位相加,将结果存入结果链表;需要进位的值存储下来,下一位相加时加入

 public class ListNode {
		    int val;
		    ListNode next;
            ListNode(int x) { val = x; }
		  }
	 public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
          /*定义carry表示节点进位存储
           *比如当前节点为8,9;8+9=17需要进位1,则 carry=1;
           *sum节点的和*/		  
          int carry=0,sum=0;
          /*声明链表,头节点初始为0*/
		  ListNode result=new ListNode(0);
		  /*声明cursor指针指向result头节点*/
		  ListNode cursor = result;
		  while (l1!=null || l2!=null || carry!=0) {
			  /*l1Val和l2Val分别记录当前l1和l2节点的值
			   * 如果l1不为null,则用l1Val记录l1.val的值
			   * 若l1为0,则l1Val为0;l2同理*/
			  int l1Val = l1!= null?l1.val:0;
			  int l2Val = l2!= null?l2.val:0;
			  /*sum为l1和l2当前位数的和,加上一位数的进位carry*/
			  sum=l1Val+l2Val+carry;
			  /*记录进位数*/
			  carry=sum/10;
			  /*存入当前节点结果
			   * 不能直接cursor=new ListNode(sum%10);
			   * 这样会覆盖原先cursor指向的result节点;
			   * */
			  cursor.next=new ListNode(sum%10);
			  /*当前节点不为空,后移节点*/
			  if(l1 != null) l1 = l1.next;
	          if(l2 != null) l2 = l2.next;
	          /*指针后移*/
	          cursor=cursor.next;
		}
		    /*返回结果链表*/
			return result.next;
               
	    }

你可能感兴趣的:(算法)