LeetCode#2 | Nobilta's Blog
0%

LeetCode#2

LeetCode#2两数相加

题目链接
一道用链表存储每一位数,然后按位相加的题目,遍历起来没有任何难度,主要是需要注意循环结束的条件:

  • 第一个和第二个链表都到了末尾(都到了末尾才相当于把两个‘数’都遍历了一遍,只有一个指向nullptr时不行的)
  • 自定义的进位位需要为0(因为两个数相加可能会产生进位的情况,如果我们只考虑是否把两个已知链表遍历完了,那么可能最后会少一位)
    其他就没什么难点了,无非是处理链表遍历的时候,如何声明新的节点和访问next节点(要避免不越界)
    附代码:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    /**
    * Definition for singly-linked list.
    * struct ListNode {
    * int val;
    * ListNode *next;
    * ListNode() : val(0), next(nullptr) {}
    * ListNode(int x) : val(x), next(nullptr) {}
    * ListNode(int x, ListNode *next) : val(x), next(next) {}
    * };
    */
    class Solution {
    public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    ListNode* ans = nullptr;//我们返回的答案head节点,声明的时候可以先声明为空
    int inc = 0;//记录是否有进位
    int val = 0;//记录当天两个链表相加的值
    ListNode* cur = nullptr;//遍历时需要用到的temp节点,也可以看作是链表中的tail节点吧?
    while(l1 != nullptr || l2 != nullptr || inc != 0)
    {
    int x1,x2;
    if(l1 == nullptr)//如果其中一个链表已经到了末尾(空节点),直接将val看作0即可
    x1 = 0;
    else
    {
    x1 = l1 -> val;
    l1 = l1 -> next;//访问这个链表的下一个节点
    }

    if(l2 == nullptr)//同上
    x2 = 0;
    else
    {
    x2 = l2 -> val;
    l2 = l2 -> next;
    }

    val = x1 + x2 + inc;//别忘了处理进位
    inc = val/10;
    val %= 10;
    if(ans == nullptr)//在第一个head节点需要额外单独处理一下
    {
    ans = new ListNode(val);
    cur = ans;
    }
    else
    {
    cur -> next = new ListNode(val);//相当于处理tail节点
    cur = cur -> next;
    }
    }
    return ans;
    }
    };
您的支持将鼓励我继续创作!