一緒に2 leetcodeアルゴリズムタイトル二つの数

2.追加二つの数(平均)

我々は2つ示されている非空リストを表すために使用される二つの非負の整数その中でも、それぞれの中央値は、ある方法でストレージの逆の順番、そして、彼らは、各ノードは一桁を保存することができます
我々場合はこれら二つの数字を足し、それは新しいリストを返しますし、それらを表現します。
あなたは数字0に加えて、これらの二つの数字が0で始まっていないと仮定することができます。

示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

方法の一つ:一般的なアプローチ

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        int len1=1;//记录l1的长度
        int len2=1;//记录l2的长度
        ListNode* p=l1;
        ListNode* q=l2;
        while(p->next!=NULL)//获取l1的长度
        {
            len1++;
            p=p->next;
        }
        while(q->next!=NULL)//获取l2的长度
        {
            len2++;
            q=q->next;
        }
        if(len1>len2)//l1较长,在l2末尾补零
        {
            for(int i=1;i<=len1-len2;i++)
            {
                q->next=new ListNode(0);
                q=q->next;
            }
        }
        else//l2较长,在l1末尾补零
        {
            for(int i=1;i<=len2-len1;i++)
            {
                p->next=new ListNode(0);
                p=p->next;
            }
        }
        p=l1;
        q=l2;
        bool count=false;//记录进位
        ListNode* l3=new ListNode(-1);//存放结果的链表
        ListNode* w=l3;//l3的移动指针
        int i=0;//记录相加结果
        while(p!=NULL&&q!=NULL)
        {
            i=count+p->val+q->val;
            w->next=new ListNode(i%10);
            count=i>=10?true:false;
            w=w->next;
            p=p->next;
            q=q->next;
        }
        if(count)//若最后还有进位
        {
            w->next=new ListNode(1);
            w=w->next;
        }
        return l3->next; 
    }
};

L1および12第一の計算リストの長さは、キャリーがL3に加えに格納され、同一の長さを許可
短いゼロパディングリストに2端; 1.取得リストは、2つの長さに対応する.. 3整列添加をキャリービット考慮
方法二つ:リストはキャリービットを考慮して、次に合計プラス(各ビットの代表の結果)空でない場合、ゼロパディングと整列していません

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* head=new ListNode(-1);//存放结果的链表
        ListNode* h=head;//移动指针
        int sum=0;//每个位的加和结果
        bool carry=false;//进位标志
        while(l1!=NULL||l2!=NULL)
        {
            sum=0;
            if(l1!=NULL)
            {
                sum+=l1->val;
                l1=l1->next;
            }
            if(l2!=NULL)
            {
                sum+=l2->val;
                l2=l2->next;
            }
            if(carry)
                sum++;
            h->next=new ListNode(sum%10);
            h=h->next;
            carry=sum>=10?true:false;
        }
        if(carry)
        {
            h->next=new ListNode(1);
        }
        return head->next;
    }
};

方法2についての最適化:

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode *dummy = new ListNode(-1), *cur = dummy;
        int carry = 0;
        while (l1 || l2) {
            int val1 = l1 ? l1->val : 0;
            int val2 = l2 ? l2->val : 0;
            int sum = val1 + val2 + carry;
            carry = sum / 10;
            cur->next = new ListNode(sum % 10);
            cur = cur->next;
            if (l1) l1 = l1->next;
            if (l2) l2 = l2->next;
        }
        if (carry) cur->next = new ListNode(1);
        return dummy->next;
    }
};

私たちは、新しいノードが新しいリストの後ろに追加され、その後、スクラッチ・バックラインと、すべての2回の加算からの二つのリストを入力して、新しいリストを作成します。リストを回避するために2つの入力が同時に空になった後、我々は、ダミーノードを構成する、2つのノードがダミーノード自体を変更することはできないので、そうポインタを使用して、ダミーノードの順序に追加される新しいノードを生成するために追加されます新しい最後のノードを指すようにCURリスト。リストを横断しながら、さて、あなたは二つのリストが追加されていることを確認するために開始することができ、そしてこの質問は、リスト内で最も低い位置の冒頭にいいです、それはローからハイに加えて、直接オーダーすることが可能です。二つのリスト条件whileループなどのリストが空であってもよいので、空行が存在しないように、現在のノードの値をとるときに、0にセットが空の場合、そうでない場合、それはノードの値が何であるかを、決定するために、長いです。次いで、2つの値がキャリープラス桁上げながら、ノードが追加されます。次いで、更新キャリーは、直接和/ 10とすることができ、次いで次のノードへの移動を10%加算後CURに接続された新しいノードの値、CURを確立し。2つのノードはその後、次の位置に存在する場合、ポイントを更新した後。whileループが終了した後、最後に特別な問題の最上位ビットがキャリーが1の場合、ノード1に戻り、次の新しいリストを構築することです、それに対処します。

公開された40元の記事 ウォン称賛10 ビュー2271

おすすめ

転載: blog.csdn.net/weixin_44244154/article/details/104781588