• LeetCode:2. 两数相加


    给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

    请你将两个数相加,并以相同形式返回一个表示和的链表。

    你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

    2. 两数相加 - 力扣(LeetCode)

     

    1. /**
    2. * Definition for singly-linked list.
    3. * struct ListNode {
    4. * int val;
    5. * ListNode *next;
    6. * ListNode() : val(0), next(nullptr) {}
    7. * ListNode(int x) : val(x), next(nullptr) {}
    8. * ListNode(int x, ListNode *next) : val(x), next(next) {}
    9. * };
    10. */

    解1:

    1. // 方法一
    2. int len(ListNode* head) {
    3. int len = 0;
    4. while(head){
    5. head=head->next;
    6. len++;
    7. }
    8. return len;
    9. }
    10. class Solution {
    11. public:
    12. ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    13. ListNode* p1=l1;
    14. ListNode* p2=l2;
    15. int len1,len2;
    16. len1 = len(p1);
    17. len2 = len(p2);
    18. int flag = 0;
    19. bool maxBool = 1;
    20. if(len1>=len2) {
    21. if(len1==len2)
    22. flag = 1;
    23. }else{
    24. p1=l2;
    25. p2=l1;
    26. maxBool=0;
    27. }
    28. // if(len1
    29. // p1=l2;
    30. // p2=l1;
    31. // maxBool=0;
    32. // }
    33. // else if(len1==len2) {
    34. // flag = 1;
    35. // }
    36. int tmpval=0;
    37. while(p1) {
    38. if(p2) {
    39. p1->val += p2->val;
    40. p2=p2->next;
    41. }
    42. p1->val += tmpval;
    43. if(p1->val >= 10) {
    44. tmpval = 1;
    45. p1->val -= 10;
    46. }else{
    47. tmpval = 0;
    48. }
    49. if(p1->next==nullptr && tmpval) {
    50. if(p1->val != 0 && !flag){
    51. p1->val += tmpval;
    52. }else {
    53. ListNode* tail =new ListNode;
    54. p1->next = tail;
    55. }
    56. }
    57. p1=p1->next;
    58. }
    59. return maxBool ? l1:l2;
    60. }
    61. };

    解:2:

    1. class Solution {
    2. public:
    3. ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    4. ListNode* p1=l1;
    5. ListNode* p2=l2;
    6. int flag = 0;
    7. ListNode* tail1,*tail2;
    8. int tmpval=0;
    9. while(p1 || p2) {
    10. if(!p1) {
    11. flag = 1;
    12. p1 = tail1->next = new ListNode;
    13. }
    14. if(!p2) {
    15. flag = 0;
    16. p2 = tail2->next = new ListNode;
    17. }
    18. p1->val += p2->val;
    19. p1->val += tmpval;
    20. if(p1->val >= 10) {
    21. tmpval = 1;
    22. // p1->val %= 10;
    23. p1->val -= 10;
    24. }else{
    25. tmpval = 0;
    26. }
    27. if(p1->next==nullptr && tmpval) {
    28. // if((p1->val % 10) != 0 && ((p2->next!=nullptr) && flag)){
    29. // if((p1->val % 10) != 0 && flag){
    30. // if((p1->val - 10)!= 0 && flag){
    31. if(p1->val!= 0 && flag){
    32. p1->val += tmpval;
    33. }
    34. else {
    35. ListNode* tail =new ListNode;
    36. p1->next = tail;
    37. }
    38. }
    39. if(!p1->next) tail1 = p1;
    40. if(!p2->next) tail2 = p2;
    41. p2 = p2->next;
    42. p1 = p1->next;
    43. }
    44. return l1;
    45. }
    46. };

    解3

    1. class Solution {
    2. public:
    3. ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    4. ListNode* head = nullptr;
    5. ListNode* cur = head;
    6. int t = 0;
    7. while(l1!=nullptr || l2!=nullptr) {
    8. int a = l1 == nullptr ? 0 : l1->val;
    9. int b = l2 == nullptr ? 0 : l2->val;
    10. int r = a + b + t;
    11. if(r >= 10) {
    12. r -= 10;
    13. t = 1;
    14. }else {
    15. t = 0;
    16. }
    17. if(!head) {
    18. head = new ListNode(r);
    19. cur = head;
    20. } else {
    21. cur->next = new ListNode(r);
    22. cur = cur->next;
    23. }
    24. l1 = l1 == nullptr ? nullptr : l1->next;
    25. l2 = l2 == nullptr ? nullptr : l2->next;
    26. }
    27. if(t !=0 ) {
    28. cur->next = new ListNode(t);
    29. }
    30. return head;
    31. }
    32. };

    LeetCode 官方解答:

    1. class Solution {
    2. public:
    3. ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    4. ListNode *head = nullptr, *tail = nullptr;
    5. int carry = 0;
    6. while (l1 || l2) {
    7. int n1 = l1 ? l1->val: 0;
    8. int n2 = l2 ? l2->val: 0;
    9. int sum = n1 + n2 + carry;
    10. if (!head) {
    11. head = tail = new ListNode(sum % 10);
    12. } else {
    13. tail->next = new ListNode(sum % 10);
    14. tail = tail->next;
    15. }
    16. carry = sum / 10;
    17. if (l1) {
    18. l1 = l1->next;
    19. }
    20. if (l2) {
    21. l2 = l2->next;
    22. }
    23. }
    24. if (carry > 0) {
    25. tail->next = new ListNode(carry);
    26. }
    27. return head;
    28. }
    29. };

  • 相关阅读:
    基于nodejs+vue旅行社网站系统
    C++——std::async和std::thread
    随笔感悟:Mysql悲观锁和乐观锁
    左神高级提升班1 很重要的题目
    java项目之家用电器销售网站(源码+文档)
    Linux友人帐之日志与备份
    开启Clash和系统代理后Chrome无法打开网页但Edge正常
    跨境分析 | 疫情之下跨境电商如何选品?这类商品亚马逊销量不降反增
    【C++】笔试训练(四)
    HCIA-R&S自用笔记(25)NAT技术背景、NAT类型及配置
  • 原文地址:https://blog.csdn.net/weixin_41987016/article/details/132815992