解法一:
思路很简单:
先遍历两个单链表,分别组成两个数,相加后得到和,再把和倒序插入单链表即可
注意两点:
1. 单链表组成的数可能会超过int范围,所有操作数都用long类型
2. 单链表在表尾插入节点,基础啊,,这都想了老半天,太差
public class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
long a = 0,b=0,temp =1;
while(l1 != null){
a = temp*l1.val+a;
l1 = l1.next;
temp = temp*10;
}
temp =1;
while(l2 != null){
b = temp*l2.val+b;
l2 = l2.next;
temp = temp*10;
}
long c = a+b;
ListNode l3 = new ListNode((int)(c%10));
c=c/10;
while(c>0){
insert(l3,(int)(c%10));
c=c/10;
}
return l3;
}
public void insert(ListNode l3,int i){
ListNode tail = l3.next;
if(tail != null){
while(tail.next != null){
tail = tail.next;
}
}else{
tail = l3;
}
ListNode node = new ListNode(i);
tail.next = node;
tail=tail.next;
}
解法二:
上述解法的复杂度为O(3n),由于题目的特殊性,两个数都是逆序存储的,要求输出的结果也是逆序。可以直接一个循环就可以解决,复杂度为O(n)。
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode rootNode(0);//构造一个头结点
ListNode *pCurNode = &rootNode;
int a = 0;//代表进位
while (l1 || l2)
{
int v1 = (l1 ? l1->val : 0);
int v2 = (l2 ? l2->val : 0);
int temp = v1 + v2 + a;
a = temp / 10;
ListNode *pNode = new ListNode((temp % 10));
pCurNode->next = pNode;
pCurNode = pNode;
if (l1)
l1 = l1->next;
if (l2)
l2 = l2->next;
}
if (a > 0)
{
ListNode *pNode = new ListNode(a);
pCurNode->next = pNode;
}
return rootNode.next;
}
变量a是进位,注意要构造头节点。