找回密码
 立即注册
首页 业界区 安全 每天一个小算法:两数相加

每天一个小算法:两数相加

厨浴 2025-6-1 00:12:44
题目描述

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
  1. 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
  2. 输出:7 -> 0 -> 8
  3. 原因:342 + 465 = 807
复制代码
题目解析

设立一个表示进位的变量carried,建立一个新链表,把输入的两个链表从头往后同时处理,每两个相加,将结果加上carried后的值作为一个新节点到新链表后面。
动画描述

1.gif

代码实现

C++
  1. /// 时间复杂度: O(n)
  2. /// 空间复杂度: O(n)
  3. /**
  4. * Definition for singly-linked list.
  5. * public class ListNode {
  6. *     int val;
  7. *     ListNode next;
  8. *     ListNode(int x) { val = x; }
  9. * }
  10. */
  11. class Solution {
  12. public:
  13.     ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
  14.         ListNode *p1 = l1, *p2 = l2;
  15.         ListNode *dummyHead = new ListNode(-1);
  16.         ListNode* cur = dummyHead;
  17.         int carried = 0;
  18.         while(p1 || p2 ){
  19.             int a = p1 ? p1->val : 0;
  20.             int b = p2 ? p2->val : 0;
  21.             cur->next = new ListNode((a + b + carried) % 10);
  22.             carried = (a + b + carried) / 10;
  23.             cur = cur->next;
  24.             p1 = p1 ? p1->next : NULL;
  25.             p2 = p2 ? p2->next : NULL;
  26.         }
  27.         cur->next = carried ? new ListNode(1) : NULL;
  28.         ListNode* ret = dummyHead->next;
  29.         delete dummyHead;
  30.         return ret;
  31.     }
  32. };
复制代码
Java
  1. class Solution {
  2.     public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
  3.         ListNode dummyHead = new ListNode(0);
  4.         ListNode cur = dummyHead;
  5.         int carry = 0;
  6.         while(l1 != null || l2 != null)
  7.         {
  8.             int sum = carry;
  9.             if(l1 != null)
  10.             {
  11.                 sum += l1.val;
  12.                 l1 = l1.next;
  13.             }
  14.             if(l2 != null)
  15.             {
  16.                 sum += l2.val;
  17.                 l2 = l2.next;
  18.             }
  19.             // 创建新节点
  20.             carry = sum / 10;
  21.             cur.next = new ListNode(sum % 10);
  22.             cur = cur.next;
  23.    
  24.         }
  25.         if (carry > 0) {
  26.             cur.next = new ListNode(carry);
  27.         }
  28.         return dummyHead.next;
  29.     }
  30. }
复制代码
Python

[code]class Solution(object):    def addTwoNumbers(self, l1, l2):        res=ListNode(0)        head=res        carry=0        while l1 or l2 or carry!=0:            sum=carry            if l1:                sum+=l1.val                l1=l1.next            if l2:                sum+=l2.val                l2=l2.next            # set value            if sum
您需要登录后才可以回帖 登录 | 立即注册