链表相加:

  1. 首先判断是否存在某链表为空的情况,存在直接返回另一个链表。
  2. 反转两个链表,便于从最低位开始求和计算。
  3. 初始化进位项carry = 0. 开始逐位求和,将结果保存在节点node中,并连接在以dummy为头节点的链表上。
  4. 若遍历到空节点,则判断是否存在某一条非空的情况。若存在,则与carry项一起考虑继续求和。
  5. 考虑carry是否不为0,若不为0,则额外增加一位。
  6. 最后,以哑节点的下一位节点为头节点的链表进行反转,作为最终结果。
/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
#include <sys/types.h>
class Solution {
    ListNode* reverse(ListNode* head){
        ListNode* pre = nullptr, *next;
        while(head!=nullptr){
            next = head->next;
            head->next = pre;
            pre = head;
            head = next;
        }
        return pre;
    }
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head1 ListNode类 
     * @param head2 ListNode类 
     * @return ListNode类
     */
    ListNode* addInList(ListNode* head1, ListNode* head2) {
        // 若存在某一个链表为空,则直接返回另一个链表
        if(head1==nullptr)  return head2;
        if(head2==nullptr)  return head1;
        // 翻转两个链表
        head1 = reverse(head1);
        head2 = reverse(head2);
        // 定义两个指针
        ListNode* p1 = head1, *p2 = head2;
        ListNode* dummy = new ListNode(-1);
        ListNode* p = dummy;
        int carry = 0;
        while(p1 && p2){
            int num = p1->val + p2->val + carry;
            carry = num/10;
            num = num%10;
            ListNode* node = new ListNode(num);
            p->next = node;
            p = p->next;
            p1 = p1->next;
            p2 = p2->next;
        }
        p1 = p1==nullptr ? p2 : p1;
        while(p1){
            int num = p1->val + carry;
            carry = num/10;
            num %= 10;
            ListNode* node = new ListNode(num);
            p->next = node;
            p = p->next;
            p1 = p1->next;
        }
        if(carry){
            ListNode* node = new ListNode(carry);
            p->next = node;
            p = p->next;
        }
        p = dummy->next;
        p = reverse(p);
        return p;
    }
};