002TwoNumbers(将单链表表示的两个数进行相加)
学习LeetCode打卡第二天(重要提示:原文出处在 DERRANTCM,感谢博主大大的无私分享),这篇博文主要记录自己的学习心得,2018年了,在此祝福大家学习进步,工作顺利!
下面先给出博主原文,然后在博主的代码基础上修改出可运行程序。
原题
You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
题目大意
有两个单链表,代表两个非负数,每一个节点代表一个数位,数字是反向存储的,即第一个结点表示最低位,最后一个结点表示最高位。求两个数的相加和,并且以链表形式返回。
解题思路
对两个链表都从第一个开始处理,进行相加,结果再除以10求商,作为下一位相加的进位,同时记录余数,作为本位的结果,一直处理,直到所有的结点都处理完。
代码实现
public class TwoNumbers { private static class ListNode { public ListNode next = null; public int val=0; public ListNode(){ } public ListNode (int val,ListNode n){ this.val = val; this.next = n; } /** * 002-Add Two Numbers (单链表表示的两个数相加) * @param l1 第一个数 * @param l2 第二个数 * @return 结果 */ public ListNode addTwoNumbers(ListNode l1, ListNode l2) { if (l1 == null) { return l2; } if (l2 == null) { return l1; } ListNode p1 = l1; ListNode p2 = l2; ListNode root = new ListNode(-1,null); // 构造根节点,-1表示根节点 ListNode r = root; int val = 0;//本位值 int carry = 0; // 初始进位 int sum; while (p1 != null && p2 != null) { sum = p1.val + p2.val + carry; val = sum % 10; // 本次相加的结果 carry = sum / 10; // 本次进位 r.next = new ListNode(val,null); r = r.next; // 指向最后一个相加的结点 p1 = p1.next; p2 = p2.next; } if (p1 == null) { p1 = p2; } // 最后一次相加还有进位 if (carry > 0) { // 开始时r.next是第一个要相加的结点 while (p1 != null) { sum = p1.val + carry; val = sum % 10; // 本次相加的结果 carry = sum / 10; // 本次进位 r.next = new ListNode(val,null); r = r.next; p1 = p1.next; } // 都加完了还有进位,就要创建一个新的结点 if (carry >0 ) { r.next = new ListNode(carry,null); } } return root.next; } public void printVal(ListNode n){ if (n!=null) { printVal(n.next); System.out.print(n.val); } } } public static void main(String[] args) { String str1 = "97234"; String str2 = "8766"; System.out.println(str1+"+"+str2+"="+(Integer.parseInt(str1)+Integer.parseInt(str2))); char[] s1 =str1.toCharArray(); char[] s2 = str2.toCharArray(); ListNode node1 = new ListNode(-1,null); ListNode node2 = new ListNode(-1,null); ListNode n1 = node1; ListNode n2 = node2; for(int i = s1.length-1 ; i >= 0 ; i--){ n1.next = new ListNode(Character.getNumericValue(s1[i]),null); n1 = n1.next; } for(int i = s2.length -1 ; i >= 0; i--){ n2.next = new ListNode(Character.getNumericValue(s2[i]),null); n2 = n2.next; } ListNode ln = new ListNode(); ListNode result = ln.addTwoNumbers(node1.next,node2.next);
//输出结果 ln.printVal(result); } }