2. 两数相加

379 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

2. 两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

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

image.png

思路分析

是一道把降低难度做的很生硬的题,故意将链表逆序的原因是因为我们加和需要进位,然而进位一定要按照顺序进行,因此我们需要从低位遍历到高位。

同时,如果链表长度不同,那么如果链表是顺序的从高位到低位,那么就需要“对齐”操作,但是如果变成逆序以后就可以省略对齐操作。

整理下思路:

  • 首先是加和进位
  • 然后根据和 % 10 得到新节点的值
  • 不断循环上述操作 有代码:
// 只要l1 和l2有一个没遍历到即可
while(l1 || l2){
    //加和进位
    int n1 = l1 ? l1->val: 0;
    int n2 = l2 ? l2->val: 0;
    int sum = n1 + n2 + carry;
    carry = sum / 10;
     if (!head) {
     // 赋初值
        head = tail = new ListNode(sum % 10);
    } else {
    // 设置下一个节点
        tail->next = new ListNode(sum % 10);
        tail = tail->next;
    }
    if(l1)l1 = l1->next;
    if(l2)l2 = l2->next;

}
//判断进位是否需要加1
if (carry == 1){
    tmp = l3.next;
    tmp.val = carry;
    tmp.next = null;
    
}