写在前面: 第一次写的时候没有复用链表头插法这个函数,导致代码杂乱不易读,不过即使这样代码还是很累赘。。我是直接两次链表头插法得出结果,还有有以下思路
- 递归
- 栈
- 提取链表节点的值合并后用字符串存起来,再用链表取出来最后返回
欢迎关注我的 力扣github仓库,有JavaScript和C++两个版本,每日更新
C++代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
// 链表头插法逆序
ListNode* reverse(ListNode *head){
ListNode *L=new ListNode,*p=L;
while(head)
{
ListNode *temp=head->next;
head->next=p->next;
p->next=head;
head=temp;
}
return L->next;
}
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode *p=reverse(l1),*q=reverse(l2);
ListNode *temp_p=p,*flag;
while(p && q)
{
//将对应节点之和加到p上
p->val+=q->val;
flag=p;
if(p->val>=10 && p->next){
p->val%=10;
p->next->val+=1;
}
p=p->next;
q=q->next;
}
if(!p)
flag->next=q; //flag是p的前一个节点
while(flag->next)
{
if(flag->val>=10){
flag->val%=10;
flag->next->val+=1;
}
flag=flag->next;
}
if(flag->val>=10){
flag->val%=10;
ListNode *node=new ListNode(1);
flag->next=node;
}
return reverse(temp_p);
}
};
JS代码:
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var reverse=function(head){
var L=new ListNode,p=L;
while(head)
{
var temp=head.next;
head.next=p.next;
p.next=head;
head=temp;
}
return L.next;
}
var addTwoNumbers = function(l1, l2) {
var p=reverse(l1),q=reverse(l2);
var temp_p=p,flag;
while(p && q)
{
//将对应节点之和加到p上
p.val+=q.val;
flag=p;
if(p.val>=10 && p.next){
p.val%=10;
p.next.val+=1;
}
p=p.next;
q=q.next;
}
if(!p)
flag.next=q; //flag是p的前一个节点
while(flag.next)
{
if(flag.val>=10){
flag.val%=10;
flag.next.val+=1;
}
flag=flag.next;
}
if(flag.val>=10){
flag.val%=10;
var node=new ListNode(1);
flag.next=node;
}
return reverse(temp_p);
};