[关闭]
@Sherlockyang 2018-06-04T03:00:04.000000Z 字数 1209 阅读 583

2.两个大数字之和

leetcode


代码

  1. ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
  2. int e_out=0,e1,e2,e;
  3. ListNode* ans;
  4. ListNode* ans_point;
  5. e1 = l1->val;
  6. e2 = l2->val;
  7. if(e1+e2<10)
  8. {
  9. e_out = 0;
  10. e = e1+e2;
  11. }
  12. else
  13. {
  14. e = e1+e2-10;
  15. e_out = 1;
  16. }
  17. ans = new ListNode(e);
  18. l1 = l1->next;
  19. l2 = l2->next;
  20. ans_point = ans;
  21. while((l1!=NULL)||(l2!=NULL))
  22. {
  23. if(l1==NULL&&l2!=NULL)
  24. {
  25. e1 = 0;
  26. e2 = l2->val;
  27. l2 = l2->next;
  28. }
  29. if(l1!=NULL&&l2==NULL)
  30. {
  31. e1 = l1->val;
  32. e2 = 0;
  33. l1=l1->next;
  34. }
  35. if(l1!=NULL&&l2!=NULL)
  36. {
  37. e1=l1->val;
  38. e2=l2->val;
  39. l1=l1->next;
  40. l2=l2->next;
  41. }
  42. if(e1+e2+e_out<10)
  43. {
  44. e = e1+e2+e_out;
  45. e_out = 0;
  46. }
  47. else
  48. {
  49. e = e1+e2+e_out-10;
  50. e_out = 1;
  51. }
  52. ans_point->next = new ListNode(e);
  53. ans_point = ans_point->next;
  54. }
  55. if(e_out == 1)
  56. {
  57. ans_point->next = new ListNode(1);
  58. }
  59. return ans;
  60. }
  1. ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
  2. ListNode preHead(0), *p = &preHead;
  3. int carry = 0;
  4. while (l1 || l2 || carry) {
  5. int sum = (l1 ? l1->val : 0) + (l2 ? l2->val : 0) + carry;
  6. carry = sum / 10;
  7. p->next = new ListNode(sum % 10);
  8. p = p->next;
  9. l1 = l1 ? l1->next : l1;
  10. l2 = l2 ? l2->next : l2;
  11. }
  12. return preHead.next;
  13. };

总结

该题其实并不难
主要学到了一些数据结构的用法:

  1. struct ListNode {
  2. int val;
  3. ListNode *next;
  4. ListNode(int x) : val(x), next(NULL) {}
  5. };

这个定义很有意思,里面有一条函数的定义。其实这个可以用new ListNode(x)来开辟一个指向这个值的空间。节省了代码书写,提高的了代码的可阅读性。

然后可以使用l1 ? l1-val : 0这样的表达式来提取数据结构里面值。

最后,我采用了数学归纳法的思路来解决这道题,其实是没有必要的。因为最后可以输出ans.next,这样就比较好的避免了头节点的问题。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注