链表问题---两个单链表生成相加链表

【题目】

假设链表中每一个节点的值都在0~9之间,那么链表整体就可以代表一个整数。
例如:9 -> 3 -> 7,可以代表整数937。
给定两个这种链表的头节点head1和head2,请生成代表两个整数相加值的结果链表。
例如:链表1为9 -> 3 -> 7,链表2为6 -> 3,最后生成新的结果链表为1 -> 0 -> 0 -> 0。

【基本思路】

容易想到的方法是先将两个链表的值表示出来,然后将两个值累加起来,再根据累加结果生成一个新链表。这种方法实际是不可行的,因为链表的长度可以很长,表示的数字可以很大,容易出现int类型溢出。

**方法一。**利用两个栈,分别将链表1、2的值压入栈中,这样就生成了两个链表的逆序栈。将两个栈同时弹出,这样就相当于两个链表从低位到高位依次弹出,在这个过程中生成相加链表即可。注意相加过程中的进位问题。

#python3.5
def addList1(head1, head2):
    if head1 == None or head2 == None:
        raise Exception("Input Error!")
    s1 = []
    s2 = []
    while head1 != None:
        s1.append(head1.val)
        head1 = head1.next
    while head2 != None:
        s2.append(head2.val)
        head2 = head2.next
    print("post")
    carry = 0
    pre = None
    while s1 or s2:
        num1 = 0 if not s1 else s1.pop()
        num2 = 0 if not s2 else s2.pop()
        sum = num1 + num2 + carry
        node = Node(sum % 10)
        node.next = pre
        pre = node
        carry = sum // 10
    if carry == 1:
        node = Node(1)
        node.next = pre
        pre = node
    return pre

**方法二。**将链表逆序求解,可以省掉用栈的空间。

def addList2(head1, head2):
    if head1 == None or head2 == None:
        raise Exception("Input Error!")
    head1 = reverseList(head1)
    head2 = reverseList(head2)
    pre1 = head1
    pre2 = head2
    pre = None
    carry = 0
    while pre1 != None or pre2 != None:
    	x = pre1.val if pre1 else 0
    	y = pre2.val if pre2 else 0
        sum = x + y + carry
        node = Node(sum % 10)
        node.next = pre
        pre = node
        carry = sum // 10
        pre1 = pre1.next if pre1 else None
        pre2 = pre2.next if pre2 else None
    if carry == 1:
        node = Node(1)
        node.next = pre
        pre = node
    reverseList(head1)
    reverseList(head2)
    return pre

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值