链表相加:
- 首先判断是否存在某链表为空的情况,存在直接返回另一个链表。
- 反转两个链表,便于从最低位开始求和计算。
- 初始化进位项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;
}
};

京公网安备 11010502036488号