2 Add Two Numbers

题目描述:

You are given two non-empty linked lists representing two non-negative integers. 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.

Example 1:

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

Note:

  1. You may assume the two numbers do not contain any leading zero, except the number 0 itself.

题目翻译

给定两个链表,非负元素从低位向高位排列,如(2 -> 4 -> 3)表示342。求两个链表对应数据之和并从低位到高位输出。

示例1:

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

注意:

  1. 除链表对应数据为零外,数据首位元素不为零

解题方案

标签: Array

思路:

  • 模拟十进制加法运算,从低位到高位两个链表l1,l2公共部分依次相加求和,链表l3为对应两个元素的和,等于本位相加再加上进位。
  • 当本位之和加进位大于10时,进位为1,保留本位之和加进位减去10作为l3本位。否则,进位为零,本位之和加进位作为l3的本位
  • 最后对于两个链表中长的那一个,将最低位加上进位继续求和后链接到l3后面作为输出即可。

代码:

# 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 
        """  
        l3, p1, p2= ListNode(0), l1, l2   #l3为新链表头结点
        temp = l3 #当前和前一个元素指针(不设temp=l3.next,防止赋空值出现错误)  
        carry = 0  #进位  
        while p1 and p2:    #遍历两个链表公共部分  
            num = p1.val + p2.val + carry  
            if num > 9:  
                num -= 10  
                carry = 1 #和大于10,进位为1 
            else:  
                carry = 0  #和小于10,进位为0
            # 尾插法添加结点  
            temp.next = ListNode(num)  
            temp = temp.next  
            # 向后移动l1,l2工作指针  
            p1 = p1.next  
            p2 = p2.next
        #END WHILE
        # 取两条链长的那条剩下的部分  
        if p2: p1 = p2  
        #对长的链表继续求和
        while p1:  
            num = p1.val + carry  #加上进位
            if (num > 9):  
                num -= 10  
                carry = 1  
            else:  
                carry = 0 
           #尾插法添加新节点   
            temp.next = ListNode(num)  
            temp = temp.next  
           #向后移动工作指针 
            p1 = p1.next  
        # 如果最后还有进位,再分配一个结点,值为1  
        if carry:  
            temp.next = ListNode(1)  
            temp = temp.next  
        temp.next = None    # 将链表收尾  
        return l3.next    #去掉空的头结点

参考资料

results matching ""

    No results matching ""