[leetcode] 2. Add Two Numbers

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

这道题考察的就是链表的遍历,没什么难度。两个链表同时从头开始遍历相加直至其中一个到头,然后继续遍历另外一个。需要注意的就是相加过程中进位的处理和遍历结束后最后一次相加的时候也可能有进位的情况。

网上还有另外一种解法是分别遍历两个链表,把两个链表分别变成两个整数,然后两整数相加,最后的和再分解成一个链表。这种解法在链表比较短的时候没问题,一旦链表很长,在计算整数的时候就会出现溢出情况。

Java 代码

/**
 * 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) {
        ListNode result = new ListNode(-1);
        ListNode next = result;
        int rest = 0;
        while(l1!=null&&l2!=null){
            int tmp = l1.val + l2.val + rest;
            ListNode cur = new ListNode(tmp%10);
            rest = tmp/10;
            next.next=cur;
            next=cur;
            l1=l1.next;
            l2=l2.next;
        }
        while(l1!=null){
            int tmp = l1.val + rest;
            ListNode cur = new ListNode(tmp%10);
            rest = tmp/10;
            next.next=cur;
            next=cur;
            l1=l1.next;
            
        }
        while(l2!=null){
            int tmp = l2.val + rest;
            ListNode cur = new ListNode(tmp%10);
            rest = tmp/10;
            next.next=cur;
            next=cur;
            l2=l2.next;
        }
        if(rest>0){
            ListNode cur = new ListNode(rest%10);
            next.next=cur;
            next=cur;
        }
        return result.next;
    }
}


Go 代码

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
    var result *ListNode = &ListNode{
        Val:-1,
        Next:nil,
    }
    var next *ListNode = result
    var rest int = 0
    for{
        if l1 == nil || l2 == nil{
            break
        }
        var tmp int = l1.Val + l2.Val + rest
        var cur *ListNode = &ListNode{
            Val:tmp%10,
            Next:nil,
        }
        rest = tmp/10
        next.Next=cur
        next=cur
        l1=l1.Next
        l2=l2.Next
    }
    for{
        if l1 == nil {
            break
        }
        var tmp int = l1.Val + rest
        var cur *ListNode = &ListNode{
            Val:tmp%10,
            Next:nil,
        }
        rest = tmp/10
        next.Next=cur
        next=cur
        l1=l1.Next
    }
    for{
        if l2 == nil {
            break
        }
        var tmp int = l2.Val + rest
        var cur *ListNode = &ListNode{
            Val:tmp%10,
            Next:nil,
        }
        rest = tmp/10
        next.Next=cur
        next=cur
        l2=l2.Next
    }
    if rest > 0{
        var cur *ListNode = &ListNode{
            Val:rest%10,
            Next:nil,
        }
        next.Next=cur
    }
    return result.Next
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值