SHU-2016-SummerPractice / AlgorithmExerciseIssues

算法训练相关文件及工单。
https://github.com/SHU-2016-SummerPractice/AlgorithmExerciseIssues/issues
2 stars 0 forks source link

搜索题&单链表 2016-7-12 #4

Open SnackMen opened 7 years ago

SnackMen commented 7 years ago

POJ1011

LeetCode 2 Add Two Numbers

dayang commented 7 years ago

[AC] LeetCode 2 Add Two Numbers

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function(l1, l2) {
    var tail = null;
    var head = null;
    var num = 0,val,p;
    var p1 = l1,p2 = l2;
    while(p1 !== null && p2 !== null){
        if(p1.val + p2.val + num >= 10){
            val = (p1.val+p2.val + num)%10;
            num = 1;
        }else{
            val = p1.val+p2.val + num;
            num = 0;
        }
        p = new ListNode(val);
        if(tail){
            tail.next = p;
            tail = p;
        }else{
            tail = p;
            head = tail;
        }
        p1 = p1.next;
        p2 = p2.next;
    }

    while(p1 !== null){
        if(p1.val  + num >= 10){
            val = (p1.val + num)%10;
            num = 1;
        }else{
            val = p1.val + num;
            num = 0;
        }
        p = new ListNode(val);
        tail.next = p;
        tail = p;
        p1 = p1.next;
    }

    while(p2 !== null){
        if(p2.val  + num >= 10){
            val = (p2.val + num)%10;
            num = 1;
        }else{
            val = p2.val + num;
            num = 0;
        }
        p = new ListNode(val);
        tail.next = p;
        tail = p;
        p2 = p2.next;
    }

    if(num > 0){
        p = new ListNode(num);
        tail.next = p;
    }
    return head;
};

简化版:

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function(l1, l2) {
    var dumHead = new ListNode(0);
    var cur = dumHead;
    var p = l1, q = l2;
    var x1,x2,sum,carry = 0;
    while(p!==null || q!==null){
        x1 = (p !== null ? p.val : 0);
        x2 = (q !== null ? q.val : 0);
        sum = x1 + x2 + carry;
        carry = Math.floor(sum/10);
        cur.next = new ListNode(sum % 10);
        cur = cur.next;
        if(p!==null) p = p.next;
        if(q!==null) q = q.next;
    }

    if(carry > 0){
        cur.next = new ListNode(carry);
    }

    return dumHead.next;
};
wolfogre commented 7 years ago

[AC] LeetCode 2 Add Two Numbers

/**
 * 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) {
        ListNode *head = new ListNode(0);
        ListNode *p = head, *p1 = l1, *p2 = l2;
        int carry = 0;
        while(p1 != NULL || p2 != NULL || carry != 0)
        {
            p->next = new ListNode((p1 == NULL ? 0 : p1->val) + (p2 == NULL ? 0 : p2->val) + carry);
            p = p->next;
            carry = p->val / 10;
            p->val %= 10;
            if(p1 != NULL)
                p1 = p1->next;
            if(p2 != NULL)
                p2 = p2->next;  
        }
        p = head->next;
        delete head;
        return p;
    }
};
zhaokuohaha commented 7 years ago

LeetCode-2-C#

public class Solution
    {
        public ListNode AddTwoNumbers(ListNode l1, ListNode l2)
        {
            if (l1 == null && l2 == null) return null;
            int val;
            int nex = 0;
            if (l1 == null || l2 == null)
            {
                val = l1 == null ? l1.val : l1.val;
                if (l1 == null)
                {
                    l1 = new ListNode(0);
                }
                else {
                    l2 = new ListNode(0);
                }
            }
            else
            {
                val = (l1.val + l2.val) % 10;
                nex = (l1.val + l2.val) / 10;
            }
            ListNode l = new ListNode(val);
            ListNode ret = l;

            while (l1.next != null || l2.next != null)
            {
                l.next = new ListNode(nex);
                l = l.next;
                if (l1.next == null)
                {
                    l2 = l2.next;
                    nex = (l.val + l2.val) / 10;
                    l.val = (l.val + l2.val) % 10;

                }
                else if (l2.next == null)
                {
                    l1 = l1.next;
                    nex = (l.val + l1.val) / 10;
                    l.val = (l.val + l1.val) % 10;
                }
                else
                {
                    l1 = l1.next;
                    l2 = l2.next;
                    nex = (l.val + l1.val + l2.val) / 10;
                    l.val = (l.val + l1.val + l2.val) % 10;

                }
            }
            if(nex != 0)
            {
                l.next = new ListNode(nex);
            }
            return ret;
        }
    }