leetcode 445.两数相加II(medium)

题目:给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。(不能对列表中的节点尽心翻转)

示例:   输入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)        输出: 7 -> 8 -> 0 -> 7

思路:先将两链表补齐为等长链表,再以递归方式按位进行加和

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
    private:
  //递归函数
    void addlinklist(ListNode *s1,ListNode *s2,int *cout)
    {
        if(s1==NULL&&s2==NULL) return;
        if(s1!=NULL&&s2!=NULL) addlinklist(s1->next,s2->next,cout);
        int sum=s1->val+s2->val+*cout;
        if(sum>=10)
        {*cout=1;s1->val=sum%10;}
        else {*cout=0;s1->val=sum;}
        return;
    }
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        //链表补齐
        ListNode *head1=new ListNode(0);
        ListNode *head2=new ListNode(0);
        head1->next=l1;
        head2->next=l2;
        ListNode *p1=head1;
        ListNode *p2=head2;
        while(p1!=NULL&&p2!=NULL)
        {
            p1=p1->next;
            p2=p2->next;
        }
        if(p1==NULL)
        {
            while(p2!=NULL)
            {
                ListNode *temp=new ListNode(0);
                temp->next=head1->next;
                head1->next=temp;
                p2=p2->next;
            }
        }
        if(p2==NULL)
        {
            while(p1!=NULL)
            {
                ListNode *temp=new ListNode(0);
                temp->next=head2->next;
                head2->next=temp;
                p1=p1->next;
            }
        }
        int *cout=new int(0);
        addlinklist(head1,head2,cout);
        if(head1->val==0) return head1->next;
        else return head1;
    }
};

猜你喜欢

转载自blog.csdn.net/lyychlj/article/details/104686756
今日推荐