我们知道两个数相加是从低位往高位逐位相加再看进位。
所以可以先把两个链表反转,这样就不用管链表到底多长。
定义两个指针分别指向反转后的链表头。假设链表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; } };