zl程序教程

您现在的位置是:首页 >  其他

当前栏目

面试题 02.05. 链表求和

2023-09-14 09:06:52 时间

面试题 02.05. 链表求和

给定两个用链表表示的整数,每个节点包含一个数位。

这些数位是反向存放的,也就是个位排在链表首部。

编写函数对这两个整数求和,并用链表形式返回结果。

示例:

输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295
输出:2 -> 1 -> 9,即912

进阶:思考一下,假设这些数位是正向存放的,又该如何解决呢?

示例:

输入:(6 -> 1 -> 7) + (2 -> 9 -> 5),即617 + 295
输出:9 -> 1 -> 2,即912

今天,我们写一个链表求和,说句实在的,这题思路简单但是代码比较复杂,自己代码写的也是挺复杂,解题代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    int r=0;
    struct ListNode* pre,*p=l1;

    while(l1&&l2){
        l1->val=l1->val+l2->val+r;
        r=0;
        if(l1->val>=10){
            r=1;
            l1->val=l1->val-10;
        }
        pre=l1;
        l1=l1->next;
        l2=l2->next;
    }
    if(l1==NULL&&l2==NULL&&r==1){
        struct ListNode* s=(struct ListNode* )malloc(sizeof(struct ListNode));
        s->next=NULL;
        s->val=1;
        pre->next=s;

    }
    if(l1!=NULL){
         if(r==1){
            while(l1->val==9){
                l1->val=0;
                pre=l1;
                l1=l1->next;
                if(l1==NULL){
                     struct ListNode* s=(struct ListNode* )malloc(sizeof(struct ListNode));
                      s->next=NULL;
                   s->val=1;
                  pre->next=s;
                  break;

                }
            }
            if(l1!=NULL){
                l1->val=l1->val+1;
            }

        }


    }
  //    printf("%d ",r);
    if(l1==NULL&&l2!=NULL){
        pre->next=l2;
        printf("%d ",r);
        if(r==1){
            while(l2->val==9){
                l2->val=0;
                pre=l2;
                l2=l2->next;
                if(l2==NULL){
                     struct ListNode* s=(struct ListNode* )malloc(sizeof(struct ListNode));
                      s->next=NULL;
                   s->val=1;
                  pre->next=s;
                  break;

                }
            }
            if(l2!=NULL){
                l2->val=l2->val+1;
            }

        }
      
    }
    return p;
    
        

    

}