【LeetCode】2. 两数相加

链接:

https://leetcode-cn.com/problems/add-two-numbers

描述:

给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

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

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {}

思路:

从低位开始,遍历两个链表,
 将对应的值 \(val1\)\(val2\) 相加,\(sum=val1+val2+carry\)
 更新进位 \(carry=sum/10\)
 创建值为 \(sum%10\) 的新节点

注意:

  • 遍历链表时,如果未到结尾则 \(value\) 为对应位置的值,如果到了结尾则 \(value\) 为 0
  • 最后,两个链表都到了结尾,若 \(carry\) 不为 0,则增加一个进位的新节点
  • 使用哑节点(dummy node),避免特殊情况

C++

展开后查看
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode *head = new ListNode(-1);
        ListNode *cur = head;
        int carry = 0;
        while(l1 || l2){
            int val1 = l1 ? l1->val : 0;
            int val2 = l2 ? l2->val : 0;
            int sum = val1 + val2 + carry;
            carry = sum / 10;
            cur->next = new ListNode(sum % 10);
            cur = cur->next;
            l1 = l1 ? l1->next : l1;
            l2 = l2 ? l2->next : l2;
        }
        if(carry){
            cur->next = new ListNode(1);
        }
        ListNode *ptrDel = head;
        head = head->next;
        delete ptrDel;
        return head;
    }
};

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 head = new ListNode(-1);
        ListNode cur = head;
        int carry = 0;
        while(l1 != null || l2 != null){
            int val1 = (l1 != null) ? l1.val : 0;
            int val2 = (l2 != null) ? l2.val : 0;
            int sum = val1 + val2 + carry;
            carry = sum / 10;
            cur.next = new ListNode(sum % 10);
            cur = cur.next;
            l1 = (l1 != null) ? l1.next : l1;
            l2 = (l2 != null) ? l2.next : l2;
        }
        if(carry > 0){
            cur.next = new ListNode(1);
        }
        return head.next;
    }
}
posted @ 2020-06-06 09:44  CrazyBlogs  阅读(108)  评论(0编辑  收藏  举报