厨浴 发表于 2025-6-1 00:12:44

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

题目描述

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

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


代码实现

C++

/// 时间复杂度: O(n)
/// 空间复杂度: O(n)
/**
* 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 *p1 = l1, *p2 = l2;
      ListNode *dummyHead = new ListNode(-1);
      ListNode* cur = dummyHead;
      int carried = 0;
      while(p1 || p2 ){
            int a = p1 ? p1->val : 0;
            int b = p2 ? p2->val : 0;
            cur->next = new ListNode((a + b + carried) % 10);
            carried = (a + b + carried) / 10;

            cur = cur->next;
            p1 = p1 ? p1->next : NULL;
            p2 = p2 ? p2->next : NULL;
      }

      cur->next = carried ? new ListNode(1) : NULL;
      ListNode* ret = dummyHead->next;
      delete dummyHead;
      return ret;
    }
};Java

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
      ListNode dummyHead = new ListNode(0);
      ListNode cur = dummyHead;
      int carry = 0;

      while(l1 != null || l2 != null)
      {
            int sum = carry;
            if(l1 != null)
            {
                sum += l1.val;
                l1 = l1.next;
            }
            if(l2 != null)
            {
                sum += l2.val;
                l2 = l2.next;
            }
            // 创建新节点
            carry = sum / 10;
            cur.next = new ListNode(sum % 10);
            cur = cur.next;
   
      }
      if (carry > 0) {
            cur.next = new ListNode(carry);
      }
      return dummyHead.next;
    }
}Python

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

老僻贞 发表于 2025-10-30 00:46:49

感谢发布原创作品,程序园因你更精彩

季卓然 发表于 2025-10-30 04:53:25

喜欢鼓捣这些软件,现在用得少,谢谢分享!

谧怏弦 发表于 2025-11-30 06:55:57

收藏一下   不知道什么时候能用到

伯斌 发表于 2025-12-13 20:50:56

新版吗?好像是停更了吧。

蔺堰 发表于 2025-12-14 10:21:45

这个有用。

呈步 发表于 2025-12-28 20:31:02

鼓励转贴优秀软件安全工具和文档!

溜椎干 发表于 2026-1-18 08:54:36

感谢分享

些耨努 发表于 2026-1-20 15:09:38

用心讨论,共获提升!

蟠鲤 发表于 2026-1-21 18:22:09

这个有用。

缣移双 发表于 2026-1-23 04:52:39

不错,里面软件多更新就更好了

梢疠 发表于 2026-1-23 09:09:38

很好很强大我过来先占个楼 待编辑

阕阵闲 发表于 2026-1-30 03:04:50

谢谢分享,辛苦了

红弘丽 发表于 2026-2-1 02:44:08

这个有用。

袋岖荤 发表于 2026-2-1 04:06:45

东西不错很实用谢谢分享

佴莘莘 发表于 2026-2-3 10:20:35

热心回复!

岳娅纯 发表于 2026-2-7 04:07:53

过来提前占个楼

疝镜泛 发表于 2026-2-8 02:49:10

用心讨论,共获提升!

戈森莉 发表于 2026-2-8 05:29:03

感谢发布原创作品,程序园因你更精彩

尹心菱 发表于 2026-2-8 12:53:47

感谢发布原创作品,程序园因你更精彩
页: [1] 2
查看完整版本: 每天一个小算法:两数相加