leetcode-2 Add Two Numbers 计算两个对应的列表和问题
1.问题描写叙述:
You are given two linked lists representing two non-negativenumbers. The digits are stored in reverse order and each of their nodes containa single digit. Add the two numbers and return it as a linked list.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
http://www.programcreek.com/2012/12/add-two-numbers/
链表的定义:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */
这里注意考虑多种情况就可以:即考虑两个链表长度不一致,遍历完链表仍有进位的情况。
解法一:较为繁琐的分类讨论方法,避免使用
public class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { if((l1==null)||(l2==null)) { return null; } int temp_val = l1.val + l2.val; int go = temp_val /10; ListNode result = new ListNode(temp_val%10); l1 = l1.next; l2 = l2.next; ListNode temp = result; while((l1!=null)&&(l2!=null)) { temp_val = l1.val + l2.val + go; ListNode temp2 = new ListNode(temp_val%10); temp.next = temp2; temp = temp2; l1 = l1.next; l2 = l2.next; go = temp_val /10; } while(l1!=null) { temp_val = l1.val + go; ListNode temp2 = new ListNode(temp_val%10); temp.next = temp2; temp = temp2; l1 = l1.next; go = temp_val /10; } while(l2!=null) { temp_val = l2.val + go; ListNode temp2 = new ListNode(temp_val%10); temp.next = temp2; temp = temp2; l2 = l2.next; go = temp_val /10; } if(go != 0) { temp.next = new ListNode(go); } return result; } }
解法二:较优的解法。但在leetcode上执行时间要劣于前者
public class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { int carry = 0;//表示进位 ListNode head = new ListNode(0);//首前节点,參照C++的尾后节点 ListNode temp = head; //一直循环至将两个链表遍历全然才退出 while((l1 != null)||(l2 != null)) { //仅需确定和的几个因子大小就可以; int first = (l1 != null) ? l1.val : 0;//使用if语句亦可 int second = (l2 != null) ? l2.val : 0; int result = first + second + carry;//每一次循环计算结果 carry = result /10; ListNode pNode = new ListNode(result % 10); temp.next = pNode; temp = pNode;//准备下一循环 if (l1 != null) { l1 = l1.next; } if (l2 != null) { l2 = l2.next; } } //还需考虑carray不等于0及仍有进位的情况 if (carry > 0) { temp.next = new ListNode(carry); } return head.next;//注意此返回值 } }
版权声明:本文博主原创文章,博客,未经同意不得转载。