给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。如果我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。  
思路
先将两数相加,再提取各位数字组成新链表。
 优点:代码简单
 缺点:无法用于大数计算
 
边遍历边相加,同时构建链表节点。需要考虑进位问题。
 
代码
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
   | bool flag = false; ListNode* L3 = L2; ListNode* cur=nullptr; unsigned short val = 0; while (L2 || L1) { 	if (L2) 	{ 		cur = L2;		 		val = cur->val + flag; 		L2 = L2->next; 	} 	else 	{ 		cur->next = L1;	 		cur = L1; 		val = flag; 	} 		 	if (L1) 	{ 		val += L1->val; 		L1 = L1->next; 	}
  	cur->val = val % 10; 	(val > 9) ? flag = 1 : flag = 0; }
  if (L1 == 0 && L2 == 0 && flag == 1) 	cur->next = new ListNode(1); return L3;
   | 
 
CSharp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
   | int flag = 0; int val = 0; ListNode L3=L2; ListNode cur=new ListNode(0); while( L2!=null|| L1!=null) { 	if(L2!=null) 	{ 		cur = L2; 		val = cur.val+flag; 		L2 = L2.next; 	} 	else 	{ 		cur.next = L1; 		cur = L1; 		val = flag; 	}
  	if(L1!=null) 	{ 		val += L1.val; 		L1 = L1.next; 	} 	cur.val = val % 10; 	flag = val > 9 ? 1 : 0; } if (L1 == null && L2 == null && flag == 1) 	cur.next = new ListNode(1); return L3;
   | 
 
考查点:单链表、大数计算