链表相加
题目实际上说明的就是两个链表存储的是两个对应的数值,我们需要把相加返回对应的一个格式。
首先我们加法运算需要从低位算起,所以我们可以用反转链表
将两个链表进行翻转,然后定义一个哨兵位头节点,每次计算的结果放到链表的后面,注意有可能最后有进位,需要我们再创建一个节点置上1,最后记得需要翻转最后的值,因为我们是低位计算完放到链表的后面的。
时间复杂度:O(N)
空间复杂度:O(1)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
/**
*
* @param head1 ListNode类
* @param head2 ListNode类
* @return ListNode类
*/
ListNode* reverse(ListNode* head)
{
ListNode* pre = nullptr;
ListNode* cur = head;
while(cur)
{
ListNode* next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
return pre;
}
ListNode* addInList(ListNode* head1, ListNode* head2) {
// write code here
head1 = reverse(head1);
head2 = reverse(head2);
int res = 0;
ListNode* dummy = new ListNode(-1);
ListNode* dummytail = dummy;
int flag = 0;
while(head1 && head2)
{
int res = head1->val + head2->val + flag;
if(res > 9)
{
flag = 1;
res = res % 10;
}
else{
flag = 0;
}
dummytail->next = new ListNode(res);
dummytail = dummytail->next;
head1 = head1->next;
head2 = head2->next;
}
ListNode* nonempty = (head2 == nullptr ? head1:head2);
while(nonempty)
{
int res = nonempty->val + flag;
if(res > 9)
{
flag = 1;
res = res % 10;
}
else{
flag = 0;
}
dummytail->next = new ListNode(res);
dummytail = dummytail->next;
nonempty = nonempty->next;
}
if(flag)
{
dummytail->next = new ListNode(1);
dummytail = dummytail->next;
}
return reverse(dummy->next);
}
};