LeetCode 2. 两数相加

题目链接

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

LeetCode 2. 两数相加_第1张图片

题目解析

我们模拟两个数相加,遍历两个链表。至于顺序,虽然是相反的,但是我们重新创建一个带头结点的链表的时候,直接让两个数相加就可以了进位向后面链接就行!

如果两个数长度不同,那么让那个短的位补0,也就是当一个数还没遍历完,但是另一个数已经遍历完毕了,那么就让短的那个数遍历的结点填补0。最后还要判断是否有进位,如果有进位,那么把该数继续接入链表后面,说明最后一次相加的时候有进位没有进行处理。

两个数相加sum=num1+num2+carry,下一位需要进的位carry=sum/10,当前位剩下的数sum%10。

代码

/**
 * 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* head=nullptr,*tail=nullptr;
        // 若其中一个链表先遍历到nullptr时
        // 再次遍历到该链表的结点就视为0
        int carry=0;
        while(l1||l2)
        {
            // 若为nullptr就取0 
            int num1=l1?l1->val:0;
            int num2=l2?l2->val:0;
            int sum=num1+num2+carry;
            if(head==nullptr)
                head=tail=new ListNode(sum%10);
            else
            {
                tail->next=new ListNode(sum%10);
                tail=tail->next;
            }
            carry=sum/10;
            if(l1) l1=l1->next;
            if(l2) l2=l2->next;
        }
        if(carry>0)
        tail->next=new ListNode(carry);
        return head;
    }
};

你可能感兴趣的:(算法练习,leetcode,算法)