链表相加:
- 首先判断是否存在某链表为空的情况,存在直接返回另一个链表。
- 反转两个链表,便于从最低位开始求和计算。
- 初始化进位项carry = 0. 开始逐位求和,将结果保存在节点node中,并连接在以dummy为头节点的链表上。
- 若遍历到空节点,则判断是否存在某一条非空的情况。若存在,则与carry项一起考虑继续求和。
- 考虑carry是否不为0,若不为0,则额外增加一位。
- 最后,以哑节点的下一位节点为头节点的链表进行反转,作为最终结果。
/** * 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; } };