【LeetCode2】Add Two Numbers★★
题目描述:
解题思路:
给定两个链表(代表两个非负数),数字的各位以倒序存储,将两个代表数字的链表想加获得一个新的链表(代表两数之和)。
如(2->4->3)(342) + (5->6->4)(465) = (7->0->8)(807)
设两个进行加法运算的链表分别为l1,l2, 结果链表为resultList,以l1[i] 表示链表l1的第i个节点的值,l2[i] 表示链表l2的第i个节点的值,carry[i]表示l[i]位相加产生的进位符。
则有以下结论:
当链表l1和l2不同时为空时:
resultList[i] = (l1[i] + l2[i] + carry[i-1]) % 10
carry[i] = (l1[i] + l2[i] + carry[i-1]) / 10
且carry[0] = 0;
Java代码:
1 //类public class LeetCode2为测试代码 2 public class LeetCode2{ 3 public static void main(String[] args) { 4 ListNode l1=new ListNode(2),l11=new ListNode(4),l12=new ListNode(3); 5 l1.next=l11; 6 l11.next=l12; 7 System.out.print("Input:["+l1.val+","+l11.val+","+l12.val+"]"); 8 ListNode l2=new ListNode(5),l21=new ListNode(6),l22=new ListNode(4); 9 l2.next=l21; 10 l21.next=l22; 11 System.out.println(",["+l2.val+","+l21.val+","+l22.val+"]"); 12 ListNode list=new Solution().addTwoNumbers(l1, l2); 13 if(list!=null) 14 System.out.print("output:["+list.val); 15 while(list.next!=null){ 16 System.out.print(","+list.next.val); 17 list.next=list.next.next; 18 } 19 System.out.println("]"); 20 } 21 } 22 class Solution { 23 public ListNode addTwoNumbers(ListNode l1, ListNode l2) { 24 ListNode resultList=new ListNode(0); 25 ListNode p1=l1,p2=l2,p3=resultList; 26 int carry=0; 27 while(p1!=null||p2!=null){ 28 if(p1!=null){ 29 carry+=p1.val; 30 p1=p1.next; 31 } 32 if(p2!=null){ 33 carry+=p2.val; 34 p2=p2.next; 35 } 36 p3.next=new ListNode(carry%10); 37 p3=p3.next; 38 carry/=10; 39 } 40 if(carry==1) 41 p3.next=new ListNode(1); 42 return resultList.next; 43 } 44 } 45 class ListNode { 46 int val; 47 ListNode next; 48 ListNode(int x) { val = x; } 49 }
程序结果: