这道题原来是leetcode上的两数相加,数据结构老师把他换了一下,换成空间复杂度为O(1),时间复杂度为O(m+n).
题目要求如下:
用单链表表示整数,例如:整数12345可表示为:1→2→3→4→5。试设计算法,通过对单链表的操作,实现两个整数的加法运算运算结果依然用单链表表示。要求算法的时间、空间复杂度分别为O(m+n)和O(1),其中m、n为表示两个整数的单链表的长度。
代码实现:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* a = reverse(l1);
ListNode* b = reverse(l2);
int carry = 0;
int sum = 0;
ListNode* p = a;
ListNode* q = b;
ListNode* r = new ListNode(0);
ListNode* s = r;
while(p&&q)
{
sum = p->val+q->val+carry;
carry = sum/10;
ListNode* temp = new ListNode(0);
temp->val = sum % 10;
r->next = temp;
r = r->next;
p = p->next;
q = q->next;
}
while(p)
{
r->next = p;
p = p->next;
r = r->next;
}
while(q)
{
r->next = q;
q = q->next;
r = r->next;
}
return reverse(s->next);
}
ListNode* reverse(ListNode* head)
{
ListNode* p = head;
ListNode* q = p->next;
ListNode* r;
p->next = NULL;
while(q!=NULL)
{
r = q->next;
q->next = p;
p = q;
q = r;
}
return p;
}
};
实现思路:
先反转两个链表,然后将两个链表对应位相加,将相加结果再次反转即可得到题目要求的链表。