注意事项:

  • 不能直接两个链表取出来数字算,因为有可能数字过大,long long也不行,所以就得一位一位挨着算。
  • 这里用 vector<int> 存链表里的数字。
  • 因为涉及到进位的情况,所以我将两个初始数字 倒着循环

c++版本

class Solution {
public:
    ListNode* addInList(ListNode* head1, ListNode* head2) {
        // write code here
        vector<int> num1, num2;
        int i, single_sum;
        if(!head1) return head2;     //有一个为空直接 return 另一个
        if(!head2) return head1;
        while(head1){                      //分别将两个链表的数字取出来放在vector中
            num1.emplace_back(head1->val);
            head1 = head1->next;
        }
        while(head2){
            num2.emplace_back(head2->val);
            head2 = head2->next;
        }
        vector<int> sum_num;
        bool tag=false;             //设置一个tag,如果需要进位就改成true,不需要进位就改成false
        //倒着循环 num1 和 num2
        for(vector<int>::iterator n1=num1.end()-1, n2=num2.end()-1;n1!=num1.begin()-1 || n2!=num2.begin()-1;){
            if(n1!=num1.begin()-1 && n2!=num2.begin()-1){     //如果两个都没到开头,两者相加即可
                single_sum = *n1 + *n2;
                n1--; n2--;
            }else if(n1 == num1.begin()-1){     //如果有一个到开头了,只需要取另一个的值即可
                single_sum = *n2;
                n2--;
            }else if(n2 == num2.begin()-1){
                single_sum = *n1;
                n1--;
            }
            if(tag) single_sum+=1;             //上一次进位了,当前数字要+1
            if(single_sum >= 10){               //判断是否需要进位
                single_sum = single_sum % 10;
                tag = true;
            }else{
                tag = false;
            }
            sum_num.emplace_back(single_sum);
        }
        
        ListNode* res = (ListNode*)malloc(sizeof(ListNode*));      //头插法
        res->next = NULL;
        for(i=0; i<sum_num.size(); i++){
            ListNode* temp = (ListNode*)malloc(sizeof(ListNode*));
            temp->val = sum_num[i];
            temp->next = res->next;
            res->next = temp;
        }
        return res->next;
    }
};

c++用的不熟,代码比较冗长,但是写的都比较简单。

python版本

  • 将两个链表用字符串提出来
  • 然后转int直接相加(相比于c++省了大数相加的部分)
  • 计算出两数之和后,循环生成新链表即可。
#
class Solution:
    def addInList(self , head1: ListNode, head2: ListNode) -> ListNode:
        # write code here
        num1 = num2 = ''
        while head1:
            num1 += str(head1.val)
            head1 = head1.next
        while head2:
            num2 += str(head2.val)
            head2 = head2.next
        
        sum_num = str(int(num1) + int(num2))
        res = head = ListNode(int(sum_num[0]))
        for i in range(1, len(sum_num)):
            temp = ListNode(int(sum_num[i]))
            head.next = temp
            head = head.next
            
        return res