原题地址(中等)

又回到最初的起点。。。

今天和昨天的每日一题,分别是力扣的第1、2题。

这道题没啥算法,就是细节不少。

模拟两数相加的过程就完事了。

我用了以下几种方法。

方法1

令p1为长度较长的链表的指针,p2为较短的链表的指针,然后把p2所指的链表的值加到p1上

这样做空间复杂度是 O(1) ,但是比较耗时

  1. class Solution {
  2. public:
  3. int calListLen(ListNode* l) {
  4. int len = 0;
  5. while(l) {
  6. l = l->next;
  7. len++;
  8. }
  9. return len;
  10. }
  11. ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
  12. int carry = 0, len1, len2, tmp;
  13. len1 = calListLen(l1);
  14. len2 = calListLen(l2);
  15. ListNode* p1, *p2, *head;
  16. if(len1 >= len2){
  17. p1 = l1;
  18. p2 = l2;
  19. head = l1;
  20. }
  21. else{
  22. p1 = l2;
  23. p2 = l1;
  24. head = l2;
  25. }
  26. while(p1) {
  27. tmp = p2 ? p1->val + p2->val + carry : p1->val + carry;
  28. p1->val = tmp % 10;
  29. carry = tmp / 10;
  30. p1 = p1->next;
  31. if(p2) p2 = p2->next;
  32. }
  33. if(carry){
  34. p1 = head;
  35. while(p1->next){
  36. p1 = p1->next;
  37. }
  38. p1->next = new ListNode(carry);
  39. }
  40. return head;
  41. }
  42. };

方法2

新建一个链表,如果l1,l2长度不同,则对短的那一个补零,使其长度相同。

  1. class Solution {
  2. public:
  3. ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
  4. int a=0, carry=0;
  5. ListNode* p=l1,* q=l2;
  6. ListNode* h = new ListNode(0);
  7. ListNode* r = h;
  8. while(p || q || carry)
  9. {
  10. int num=0;
  11. num += (p) ? p->val : 0;
  12. num += (q) ? q->val : 0;
  13. if(p) p = p->next;
  14. if(q) q = q->next;
  15. num += carry;
  16. carry = num/10;
  17. num %= 10;
  18. ListNode* temp = new ListNode(num);
  19. r->next = temp;
  20. r = temp;
  21. }
  22. r->next = NULL;
  23. return h->next;
  24. }
  25. };