zoukankan      html  css  js  c++  java
  • 167. Add Two Numbers【easy】

    You have two numbers represented by a linked list, where each node contains a single digit. The digits are stored in reverse order, such that the 1's digit is at the head of the list. Write a function that adds the two numbers and returns the sum as a linked list.

     
    Example

    Given 7->1->6 + 5->9->2. That is, 617 + 295.

    Return 2->1->9. That is 912.

    Given 3->1->5 and 5->9->2, return 8->0->8.

    题意

    你有两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中相反的顺序,使得第一个数字位于链表的开头。写出一个函数将两个整数相加,用链表形式返回和。

    解法一:

     1 /**
     2  * Definition for singly-linked list.
     3  * public class ListNode {
     4  *     int val;
     5  *     ListNode next;
     6  *     ListNode(int x) {
     7  *         val = x;
     8  *         next = null;
     9  *     }
    10  * }
    11  */
    12 public class Solution {
    13     public ListNode addLists(ListNode l1, ListNode l2) {
    14         if(l1 == null && l2 == null) {
    15             return null;
    16         }
    17             
    18         ListNode head = new ListNode(0);
    19         ListNode point = head;
    20         int carry = 0;
    21         while(l1 != null && l2!=null){
    22             int sum = carry + l1.val + l2.val;
    23             point.next = new ListNode(sum % 10);
    24             carry = sum / 10;
    25             l1 = l1.next;
    26             l2 = l2.next;
    27             point = point.next;
    28         }
    29         
    30         while(l1 != null) {
    31             int sum =  carry + l1.val;
    32             point.next = new ListNode(sum % 10);
    33             carry = sum /10;
    34             l1 = l1.next;
    35             point = point.next;
    36         }
    37         
    38         while(l2 != null) {
    39             int sum =  carry + l2.val;
    40             point.next = new ListNode(sum % 10);
    41             carry = sum /10;
    42             l2 = l2.next;
    43             point = point.next;
    44         }
    45         
    46         if (carry != 0) {
    47             point.next = new ListNode(carry);
    48         }
    49         return head.next;
    50     }
    51 }

    中规中矩的解法

    解法二:

     1 public class Solution {
     2     /**
     3      * @param l1: the first list
     4      * @param l2: the second list
     5      * @return: the sum list of l1 and l2
     6      */
     7     public ListNode addLists(ListNode l1, ListNode l2) {
     8         ListNode dummy = new ListNode(0);
     9         ListNode tail = dummy;
    10 
    11         int carry = 0;
    12         for (ListNode i = l1, j = l2; i != null || j != null; ) {
    13             int sum = carry;
    14             sum += (i != null) ? i.val : 0;
    15             sum += (j != null) ? j.val : 0;
    16 
    17             tail.next = new ListNode(sum % 10);
    18             tail = tail.next;
    19 
    20             carry = sum / 10;
    21             i = (i == null) ? i : i.next;
    22             j = (j == null) ? j : j.next;
    23         }
    24 
    25         if (carry != 0) {
    26             tail.next = new ListNode(carry);
    27         }
    28         return dummy.next;
    29     }
    30 }

    比较简明的写法,且使用了dummy节点,参考@NineChapter 的代码

    解法三:

     1 public class Solution {
     2     /*
     3      * @param l1: the first list
     4      * @param l2: the second list
     5      * @return: the sum list of l1 and l2 
     6      */
     7     public ListNode addLists(ListNode l1, ListNode l2) {      
     8         ListNode root = new ListNode(-1);
     9         ListNode result = root;
    10         int carry = 0;        
    11         
    12         while( l1 != null || l2 != null || carry == 1){
    13             int value = 0;
    14             if(l1 != null){
    15                 value += l1.val;
    16                 l1 = l1.next;
    17             }
    18             if( l2 != null){
    19                 value += l2.val;
    20                 l2 = l2.next;
    21             }
    22             
    23             value += carry;            
    24             root.next = new ListNode(value % 10);
    25             carry = value / 10;
    26             
    27             root = root.next;
    28       
    29         }
    30         
    31         return result.next;
    32     }
    33 }

    解法四:

     1 class Solution {
     2 public:
     3     ListNode* addLists(ListNode* l1, ListNode* l2) {
     4         ListNode *head = new ListNode(0);
     5         ListNode *ptr = head;
     6         int carry = 0;
     7         while (true) {
     8             if (l1 != NULL) {
     9                 carry += l1->val;
    10                 l1 = l1->next;
    11             }
    12             if (l2 != NULL) {
    13                 carry += l2->val;
    14                 l2 = l2->next;
    15             }
    16             ptr->val = carry % 10;
    17             carry /= 10;
    18             // 当两个表非空或者仍有进位时需要继续运算,否则退出循环
    19             if (l1 != NULL || l2 != NULL || carry != 0) {
    20                 ptr = (ptr->next = new ListNode(0));
    21             } else {
    22                 break;
    23             }
    24         }
    25         return head;
    26     }
    27 };

    非常简明的代码,参考@NineChapter 的代码

  • 相关阅读:
    linux性能指令分析进阶篇
    数据库提升篇
    linux之基础命令大全
    数据库事务测试以及级联更新级联删除
    【Comet OJ】—模拟赛测试 Day1题解
    【Comet OJ】—模拟赛测试 Day1题解
    【LOJ # 6268】—分拆数(生成函数+多项式Ln/Exp+NTT)
    【LOJ # 6268】—分拆数(生成函数+多项式Ln/Exp+NTT)
    【LOJ #6041】【雅礼集训 2017 Day7】—事情的相似度(后缀自动机+LCT+树状数组)
    【LOJ #6041】【雅礼集训 2017 Day7】—事情的相似度(后缀自动机+LCT+树状数组)
  • 原文地址:https://www.cnblogs.com/abc-begin/p/8151199.html
Copyright © 2011-2022 走看看