《LeetCode 热题 HOT 100》—— 两数相加

首先,这道题整体还是比较简单的,只要把握题意,仔细思考,我相信各位小伙伴都可以战胜它!

首先,我们还是先阅读题目:

《LeetCode 热题 HOT 100》—— 两数相加_第1张图片

 

《LeetCode 热题 HOT 100》—— 两数相加_第2张图片

 

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

示例 2:

输入:l1 = [0], l2 = [0]
输出:[0]

示例 3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

题意分析:

首先,此函数接收两个链表 l1 和 l2,并返回一个新的链表,该链表表示两个输入列表的总和。大概的题意就是这样。接下来,我们具体分析。


 解题思路:

本题整体上的思想即为:使用初等数学的方法,采用逐位累加的策略对其进行操作。

  1. 要添加链表表示的两个数字,我们可以同时遍历两个链表并添加相应的节点。
  2. 首先我们先设置一个 哨兵位结点 用于跟踪新列表的头部,newHead 用于遍历新列表。carry 进位变量表示 进位标识符。
  3. 我们可以跟踪进位并将其添加到下一个节点的总和中。如果总和大于 9,我们需要将 1 转移到下一个节点。
  4. 其次,如果两个链表的长度不等,此时将我们需要进行补位操作,即较短的链表在末尾补零使得两个连表长度相等,再逐个元素对其相加

图解如下:

  • 第一步:

《LeetCode 热题 HOT 100》—— 两数相加_第3张图片

  •  第二步:

《LeetCode 热题 HOT 100》—— 两数相加_第4张图片

  •  第三步:

《LeetCode 热题 HOT 100》—— 两数相加_第5张图片

 

 

代码如下:

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    ListNode* dummy = new ListNode(-1);  //设置哨兵位结点
    ListNode* newHead = dummy;           //用于遍历新的链表所用
    int carry = 0;                       //进位标识符

    while (l1 || l2 || carry) {          //循环将继续,直到输入列表和进位值都为空
        int n = l1 ? l1->val: 0;
        int m = l2 ? l2->val: 0;
        int sum =  n+ m + carry; 

    //在每次迭代中,我们添加当前节点的值和进位值
        carry = sum / 10;
    //创建一个数值为【sum % 10】的新节点,并将其设置当前结点的下一个结点
        newHead->next = new ListNode(sum % 10);        
        newHead = newHead->next;         //更新当前节点的位置
        
     //往后进行迭代操作
       l1 = l1 ? l1->next : NULL;  
       l2 = l2 ? l2->next : NULL;
    }
    return dummy->next;  //最后,我们返回哨兵位节点的下一个节点,即新列表的头部。
    }
};

到此,本题便讲解结束!!!

你可能感兴趣的:(LeetCode,热题,HOT100,leetcode,算法,职场和发展)