您的位置:首页 > 其它

leetcode笔记--Add Two Numbers

2016-02-19 18:46 387 查看
题目:难度(Medium)

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

Tags:Linked List Math

Similar Problems:(M) Multiply Strings (E) Add Binary

分析:数字的各个位数被反向存储在链表里,例如342存储在链表里即为2->4->3,利用这种存储结构实现两个数相加。

可以将短链表里的数据元素依次加到长链表的对应元素中,在相加的过程中可能向高位产生进位,当短链表遍历完以后还需继续观察长链表,是否由于加上前一位的进位而导致继续向后进位,当长链表也遍历完以后,如果仍然有进位,则还需为长链表添加一个节点存储这个进位作为结果数据的最高位。

代码实现:

# 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
"""
#利用原链表的节点组成新的链表,因为题目没有要求不改变原链表
#cur指向长一些的链表,长一些的链表总是作为组成新链表的基础,q总指向短链表
len1 = self.getLenOfSinglyLinkedList(l1)
len2 = self.getLenOfSinglyLinkedList(l2)
if len1 >= len2:
head = l1
cur = l1
q = l2
else:
head = l2
cur = l2
q = l1
flag = 0
r = head
while q is not None:
sumTmp = cur.val + q.val + flag
if sumTmp > 9:
cur.val = sumTmp%10
flag = 1
else:
cur.val = sumTmp
flag = 0
r = cur
cur = cur.next
q = q.next
#短链表遍历完,还需继续观察长链表
while cur is not None:
sumTmp = cur.val + flag
if sumTmp > 9:
cur.val = sumTmp%10
flag = 1
else:
cur.val = sumTmp
flag = 0
#此时不必再观察后面的元素,因为再也没有产生进位了,可以照搬长链表后面的元素了
break
r = cur
cur = cur.next
#长链表的最后一个节点参与计算后仍然产生了一个进位,此时就需要自行创建一个新节点
if flag == 1:
cur = ListNode(1)
r.next = cur
return head

def getLenOfSinglyLinkedList(self, head):
p = head
len = 0
while p:
p = p.next
len+=1
return len
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: