Leetcode 2. 两数相加

题目描述

  两个非空链表用来表示两个非负的整数。其中,它们各自的位数按照逆序方式存储的,且每个节点只能存储一位数字。要求返回一个新的链表表示它们的和。示例:

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

思路补充:

  考虑链表的头节点问题,以及如何用新的链表表示它们的和:设置两个节点,一个作为头节点pre,另一个为实际操作节点cur,在实际操作节点cur中添加指向链表末尾的节点的指针,结束后返回pre->next。

  进位问题:中间位:设置值来记录是否要进位;最高位:在当前链表后再加一个值为1的节点

解决方法

1.  按照21题的思路解题

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

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        if l1 is None:
           return l2
        if l2 is None:
            return l1

        pre = ListNode(0)
        cur = pre
        flag = 0
        
        while l1 or l2:  
            sum1 = sum2 = 0
            if l1:
                sum1 = l1.val
                l1 = l1.next
            if l2:
                sum1 += l2.val
                l2 = l2.next
            sum2 = sum1 + flag
            flag = sum2//10
            ge = sum2%10
            cur.next = ListNode(ge)
            cur = cur.next
        if flag:
            cur.next = ListNode(1)
        cur = pre.next
        del pre
        return cur   #提交正确

注:上述解答中红色返回值部分若直接使用return pre.next,在提交代码时例子为[0]、[7,3]会报错,神奇的是本地运行确没有报错,查资料后补充原因。。。

2. 简练方法(来源题解)

    其中cur.next是最后一个节点,pre.next指链表开头。

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        pre = ListNode(0) #头节点
        cur = pre         #临时头节点
        carry = 0         #进位标志0或1
        while (l1 or l2):
            sum1 = l1.val if l1 else 0 #若数值不存在填0
            sum2 = l2.val if l2 else 0
            sums = sum1 + sum2 +carry
            carry = sums//10
            p = sums%10            #个位数
            cur.next = ListNode(p) #更新当前节点,即节点后移
            if l1:
                l1 = l1.next
            if l2:
                l2 = l2.next
            cur = cur.next
        if carry:                      #考虑最高位进位情况
            cur.next = ListNode(carry);# 若进位cur的下一节点设为1
        return pre.next                # 返回头节点

3. main函数定义

if __name__ == "__main__":
    t1 = ListNode(0)

    b1 = ListNode(7)
    b2 = ListNode(3)
    b2.next = b1

    result = Solution()
    add_sum = result.addTwoNumbers(t1, b2)

    while (add_sum != None):
        print (add_sum.val)
        add_sum = add_sum.next

 

posted @ 2020-05-04 19:02  如鹿~  阅读(173)  评论(0编辑  收藏  举报