https://leetcode.com/problems/add-two-numbers-ii/

1. Use recursion:

  1. //36 ms 70.6 MB
  2. /**
  3. * Definition for singly-linked list.
  4. * struct ListNode {
  5. * int val;
  6. * ListNode *next;
  7. * ListNode() : val(0), next(nullptr) {}
  8. * ListNode(int x) : val(x), next(nullptr) {}
  9. * ListNode(int x, ListNode *next) : val(x), next(next) {}
  10. * };
  11. */
  12. class Solution {
  13. public:
  14. ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
  15. if(!l1) return l2;
  16. else if(!l2) return l1;
  17. ListNode* curr1 = l1;
  18. ListNode* curr2 = l2;
  19. ListNode* result = NULL;
  20. int len1 = 0, len2 = 0;
  21. while(curr1){ curr1=curr1->next; len1++; }
  22. while(curr2){ curr2=curr2->next; len2++; }
  23. curr1 = l1; curr2 = l2;
  24. while(len1 > 0 && len2 > 0){
  25. int sum = 0;
  26. if(len1 >= len2){
  27. sum += curr1->val; curr1=curr1->next; len1--;
  28. }
  29. if(len2 > len1){
  30. sum += curr2->val; curr2=curr2->next; len2--;
  31. }
  32. result = addToFront(sum, result);
  33. }
  34. curr1 = result;
  35. result = NULL;
  36. int carry = 0;
  37. while(curr1){
  38. curr1->val += carry;
  39. carry = curr1->val / 10;
  40. result = addToFront( curr1->val % 10, result);
  41. curr2 = curr1;
  42. curr1 = curr1->next;
  43. delete curr2;
  44. }
  45. if(carry)
  46. result = addToFront(1, result);
  47. return result;
  48. }
  49. private:
  50. ListNode* addToFront(int val, ListNode* head){
  51. ListNode* temp = new ListNode(val);
  52. temp->next = head;
  53. return temp;
  54. }
  55. };