链表相加(二)_牛客题霸_牛客网 (nowcoder.com)
1. 任意一个链表为空,返回另一个链表就行了,因为链表为空相当于0,0加任何数为0,包括另一个加数为0的情况。
2. 反转两个链表,新建头节点 设置进位符carry=0
3. 只要某个链表还有或者进位符还有 遍历
4. 将相应位置值相加temp记录 处理temp更新进位carry
5. 将元素添加新的结点中
class Solution {
public:
/**
*
* @param head1 ListNode类
* @param head2 ListNode类
* @return ListNode类
*/
ListNode* ReverseList(ListNode* pHead) {
if (pHead == nullptr) return nullptr;
ListNode* cur = pHead;
ListNode* pre = nullptr;
while (cur != nullptr) {
ListNode* temp = cur->next;
cur->next = pre;
pre = cur;
cur = temp;
}
return pre;
}
ListNode* addInList(ListNode* head1, ListNode* head2) {
// 任意一个链表为空,返回另一个
if (head1 == nullptr) return head2;
if (head2 == nullptr) return head1;
//反转两个链表
head1 = ReverseList(head1);
head2 = ReverseList(head2);
//新建表头
ListNode* res = new ListNode(-1);
ListNode* head = res;
//进位符号
int carry = 0;
//只要某个链表还有或者进位还有
while (head1 != nullptr || head2 != nullptr || carry != 0) {
//链表不为空则取其值
int val1 = head1 == nullptr ? 0 : head1->val;
int val2 = head2 == nullptr ? 0 : head2->val;
//相加
int temp = val1 + val2 + carry;
//获取进位
carry = temp / 10;
temp %= 10;
//添加元素
head->next = new ListNode(temp);
head = head->next;
//移动下一个
if(head1 != NULL)
head1 = head1->next;
if(head2 != NULL)
head2 = head2->next;
}
return ReverseList(res->next);
}
};