leetcode2题 题解 翻译 C语言版 Python版

2. Add Two Numbers

You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8

2. 两数相加

给你两个链表表示两个非负数。各位数字是以倒序方式存在每个结点上的,每个结点保存一个数字。把这两个数相加并且以同样的形式返回一个表示和的链表。


思路:

先构建一个空的头结点不动,然后尾结点从头结点开始向后不断生成新的结点。遍历两条链公共部分,每次相加相应位数字和进位,分配到结果的链表中。公共部分遍历完后再确定长的链表剩余的部分,同样的方式遍历完。

需要注意的是遍历时每次都要更新进位,不断计算和时有没有发生进位,以防止旧数据污染。

对python来说需要新的变量作游标来遍历两链表,不能直接用形参,否则修改了原链表。

注意最后可能的进位。

对c语言来说最后要把分配的空的头结点free掉,而python则不需要。


/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
    struct ListNode *head = (struct ListNode*)malloc(sizeof(struct ListNode)), *tail = head;   //空的头结点
    int carry = 0;  //进位
    for (; l1 && l2; l1 = l1->next, l2 = l2->next){ //处理两条链公共长度部分
        int sum = l1->val + l2->val + carry;    //计算当前和
        if (sum > 9){   //处理进位
            sum -= 10;
            carry = 1;
        }
        else{
            carry = 0;
        }
        //分配结点
        tail->next = (struct ListNode*)malloc(sizeof(struct ListNode));
        tail = tail->next;
        tail->val = sum;
    }
    //取两条链长的那条剩下的部分
    l1 = l1 ? l1 : l2;
    //遍历剩余部分
    for( ; l1; l1 = l1->next){
        //加上进位计算结点值
        int sum = l1->val + carry;
        if (sum > 9){
            sum -= 10;
            carry = 1;
        }
        else {
            carry = 0;
        }
        //分配结点
        tail->next = (struct ListNode*)malloc(sizeof(struct ListNode));
        tail = tail->next;
        tail->val = sum;
    }
    //如果最后还有进位,再分配一个结点
    if (carry){
        tail->next = (struct ListNode*)malloc(sizeof(struct ListNode));
        tail = tail->next;
        tail->val = 1;  //加法的进位只可能是1
    }
    tail->next = NULL;  //将链表收尾
    //将空的头结点释放,从第二个结点返回
    tail = head;
    head = head->next;
    free(tail);
    return head;
}



# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        head, p1, p2= ListNode(0), l1, l2   #空的头结点
        tail = head #尾结点
        carry = 0;  #进位
        while p1 and p2:    #遍历两条链公共部分
            num = p1.val + p2.val + carry
            if num > 9:
                num -= 10
                carry = 1
            else:
                carry = 0
            # 添加结点
            tail.next = ListNode(num)
            tail = tail.next
            # 移动两条链
            p1 = p1.next
            p2 = p2.next
        # 取两条链长的那条剩下的部分
        if p2: p1 = p2
        while p1:
            num = p1.val + carry
            if (num > 9):
                num -= 10
                carry = 1
            else:
                carry = 0
            
            tail.next = ListNode(num)
            tail = tail.next
            
            p1 = p1.next
        # 如果最后还有进位,再分配一个结点
        if carry:
            tail.next = ListNode(1)
            tail = tail.next
        tail.next = None    # 将链表收尾
        return head.next    #去掉空的头结点





你可能感兴趣的:(leetcode)