LeetCode 2. 两数相加 Add Two Numbers

题目: 

 给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。

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

 

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原理:342 + 465 = 807

 

解题思路:

  1. 遍历两个链表
  2. 按链表的数据元素的顺序对两个数字相加,10为除数,商为进位,余数为新链表当前位置的数据
  3. 还要考虑相加是否会进位

注意空指针问题。


Java

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode list = new ListNode(0); //初始化链表
        ListNode current = list; //指向当前节点
        int add = 0; //需要进位的值

        while ((l1 != null) || (l2 != null)) {
            if (l1 != null) {
                add += l1.val;
                l1 = l1.next;
            }

            if (l2 != null) {
                add += l2.val;
                l2 = l2.next;
            }

            current.next = new ListNode(add % 10); //将当前数插入链表尾部 
            add /= 10;
            current = current.next; //修改当前指向的节点
        }

        if (add > 0) {
            current.next = new ListNode(add);
            //add大于0及最后两数相加大于等于10向前进一位
        }

        return list.next;
    }
}

 

C++

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode list(0),*current = &list;
        int add = 0;
        
        while (add || (l1!= nullptr) || (l2!=nullptr)) {
        //注意判断顺序
            if (l1 != nullptr) 
                add += l1->val;
                l1 = l1 ? l1->next : nullptr;
                //注意:l1可能是nullptr
            if (l2 != nullptr) 
                add += l2->val;
                l2 = l2 ? l2->next : nullptr;
            
            current->next = new ListNode(add%10);
            add /= 10;
            current = current->next;
        }
        
        if(add>0)
            current->next = new ListNode(add);
        
        return list.next;
    }
};

 

PHP 

class Solution {
    /**
     * @param ListNode $l1
     * @param ListNode $l2
     * @return ListNode
     */
    function addTwoNumbers($l1, $l2) {
        $list = new ListNode(0);    //初始化链表
        $current = $list;    //指向当前节点
        $add = 0;    //需要进位的值
        
        while($l1 || $l2){
            $l1v = $l1->val != null ? $l1->val : 0;
            $l2v = $l2->val != null ? $l2->val : 0;
            
            $val = ($l1v + $l2v + $add) % 10;
            $add = intval(($l1v + $l2v + $add) / 10);
            
            $current->next = new ListNode($val);   //将当前数插入链表尾部
            $current = $current->next;    //修改当前指向的节点

            if($l1 != null){
                $l1 = $l1->next;
            }
            if($l2 != null){
                $l2 = $l2->next;
            }
        }
        
        if($add > 0){
            $current->next = new ListNode($add);    
            //add大于0及最后两数相加大于等于10向前进一位
        }
        
        return $list->next;
    }
}

 

Python3

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        list = ListNode(0)
        current = list
        add = 0
        
        while(l1 or l2):
            l1v = l1.val if l1 else 0
            l2v = l2.val if l2 else 0
            
            val = (l1v+l2v+add)%10
            add = (l1v+l2v+add)//10
            
            current.next = ListNode(val)
            current = current.next

            if(l1!=None):
                l1=l1.next
            if(l2!=None):
                l2=l2.next
                
        if(add>0):
            current.next=ListNode(add)
            
        return list.next
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烟敛寒林o

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值