You are giventwo linked lists representing two non-negative numbers. The digits are storedin reverse order and each of their nodes contain a single digit. Add the twonumbers and return it as a linked list.
Input: (2 -> 4-> 3) + (5 -> 6 -> 4)
Output: 7 -> 0-> 8
思路:一开始的思路肯定是先分别计算连个链表的值,然后相加得到第三个链表的值,然后在输出为链表形式。但是:::这种方法会超时。
仔细分析,可以看出,可以两个链表分别取第一个数相加,判断是否有溢出位,然后写到输出链表,依次取两个链表剩下的结点值。这样两个链表只用循环一次,然后就可以得到输出链表。这里的难点就是要分析两个数相加sum>=10,则溢出位设为1,且sum = sum % 10;否则溢出位设为0;在除了第一个结点以外的结点相加时,还要加上溢出位。
1. /** 2. * Definition for singly-linked list. 3. * struct ListNode { 4. * int val; 5. * ListNode *next; 6. * ListNode(int x) : val(x), next(NULL) {} 7. * }; 8. */ 9. class Solution { 10. public: 11. ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { 12. int val1,val2,succ; 13. ListNode *ret = new ListNode(0); 14. int sum = l1->val + l2->val; 15. if(sum >= 10) 16. { 17. succ = 1; 18. ret->val = sum % 10; 19. } 20. else 21. { 22. succ = 0; 23. ret->val = sum; 24. } 25. ret->next = NULL; 26. 27. ListNode *p = ret; 28. ListNode *q; 29. while(l1->next && l2->next) 30. { 31. l1 = l1->next; 32. l2 = l2->next; 33. sum = l1->val + l2->val + succ; 34. q = new ListNode(0); 35. if(sum >= 10) 36. { 37. succ = 1; 38. q->val = sum % 10; 39. } 40. else 41. { 42. succ = 0; 43. q->val = sum; 44. } 45. p->next = q; 46. p = q; 47. 48. } 49. while(l1->next) 50. { 51. l1 = l1->next; 52. sum = l1->val + succ; 53. q = new ListNode(0); 54. if(sum >= 10) 55. { 56. succ = 1; 57. q->val = sum % 10; 58. } 59. else 60. { 61. succ = 0; 62. q->val = sum; 63. } 64. p->next = q; 65. p = q; 66. 67. } 68. while(l2->next) 69. { 70. l2 = l2->next; 71. sum = l2->val + succ; 72. q = new ListNode(0); 73. if(sum >= 10) 74. { 75. succ = 1; 76. q->val = sum % 10; 77. } 78. else 79. { 80. succ = 0; 81. q->val = sum; 82. } 83. p->next = q; 84. p = q; 85. 86. } 87. while(succ) 88. { 89. q = new ListNode(0); 90. q->val = succ; 91. p->next = q; 92. p = q; 93. succ = 0; 94. } 95. return ret; 96. 97. /*超时版本 98. int val1,val2,val3; 99. val1 += l1->val; 100. val2 += l2->val; 101. int i = 1; 102. while(l1->next != NULL) 103. { 104. i = i * 10; 105. l1 = l1->next; 106. val1 += i * l1->val; 107. } 108. i = 1; 109. while(l2->next != NULL) 110. { 111. i = i * 10; 112. l1 = l2->next; 113. val2 += i * l2->val; 114. } 115. 116. val3 = val1 + val2; 117. ListNode *ret = new ListNode(0); 118. ret->val = val3 % 10; 119. ret->next = NULL; 120. ListNode *tmp1 = ret; 121. ListNode *tmp2; 122. while(val3 / 10) 123. { 124. val3 = val3 / 10; 125. tmp2 = new ListNode(0); 126. tmp2->next = NULL; 127. tmp2->val = val3 % 10; 128. tmp1->next = tmp2; 129. } 130. return ret; 131. */ 132. } 133. };
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/csdnjack_/article/details/46982567