我们知道两个数相加是从低位往高位逐位相加再看进位。
所以可以先把两个链表反转,这样就不用管链表到底多长。
定义两个指针分别指向反转后的链表头。假设链表1,是用于存放相加后的结果。
p指向head1,q指向head2;
再定义一个变量 k——表示当前是否有进位。
如果两个链表一样长,结束是需要判断是否有进位。
如果两个链表不一样长,进行到某一个链表结束时,判断到底是p先结束还是q先结束,q指针指向的下一个是未结束的那个。
然后继续遍历p,只有当p->next==NULL或进位标示为0就结束。
最后如果是遍历完链表结束的循环,就需要判断当前是否有进位。
这样做的时间复杂度为O(n),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* addInList(ListNode* head1, ListNode* head2) {
// write code here
if(head1==NULL) return head2;
if(head2==NULL) return head1;
ListNode *p,*q;
head1=ReveseList(head1);
head2=ReveseList(head2);
p=head1;
q=head2;
int k=0;
int x=0;
while(p->next!=NULL&&q->next!=NULL) {
x=p->val+q->val+k;
p->val=(x>=10)?x%10:x;
k=(x>=10)?1:0;
p=p->next;
q=q->next;
}
x=p->val+q->val+k;
p->val=(x>=10)?x%10:x;
k=(x>=10)?1:0;
if(p->next==NULL&&q->next==NULL&&k){
ListNode *l=(ListNode*)malloc(sizeof(ListNode));
l->val=1;
l->next=NULL;
p->next=l;
}
else p->next=(p->next==NULL)?q->next:p->next;
while(p->next!=NULL&&k) {
p=p->next;
x=p->val+k;
p->val=(x>=10)?x%10:x;
k=(x>=10)?1:0;
}
if(p->next==NULL&&k) {
ListNode *l=(ListNode*)malloc(sizeof(ListNode));
l->val=1;
l->next=NULL;
p->next=l;
}
head1=ReveseList(head1);
return head1;
}
public: ListNode* ReveseList(ListNode* Head) {
ListNode* p=NULL;
ListNode* q=NULL;
while(Head!=NULL)
{
q=Head;
Head=Head->next;
q->next=p;
p=q;
}
return p;
}
};

京公网安备 11010502036488号