2. 两数相加

目录

2. 两数相加

mid

给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

  • 将两个链表看成是相同长度的进行遍历,如果一个链表较短则在前面补 00
    • 比如 987 + 23 = 987 + 023 = 1010
  • 每一位计算的同时需要考虑上一位的进位问题,而当前位计算结束后同样需要更新进位值
  • 如果两个链表全部遍历完毕后,若有进位制,则在新链表最前方添加包含进位制的节点

时间复杂度 O(n),空间复杂度 O(n)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        up = 0  # 进位
        node = ListNode()
        head = node  # 记录头结点的位置
        while True:
            val1 = l1.val if l1 else 0
            val2 = l2.val if l2 else 0
            _sum = val1+val2+up
            up = _sum//10 % 10  # 取十位为进位
            add = _sum % 10  # 取个位
            node.val = add

            if l1:
                l1 = l1.next
            if l2:
                l2 = l2.next

            if not l1 and not l2:
                if up > 0:
                    node.next = ListNode(val=up)
                break
            next = ListNode()
            node.next = next
            node = next
        return head
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
    up := 0
	node := &ListNode{}
	head := node
	var val1, val2 int
	for {
		if l1 != nil {
			val1 = l1.Val
		} else {
			val1 = 0
		}

		if l2 != nil {
			val2 = l2.Val
		} else {
			val2 = 0
		}

		sum := val1 + val2 + up
		up = sum / 10 % 10
		add := sum % 10

		node.Val = add

		if l1 != nil {
			l1 = l1.Next
		}
		if l2 != nil {
			l2 = l2.Next
		}

		if l1 == nil && l2 == nil {
			if up > 0 {
				node.Next = &ListNode{Val: up}
			}
			break
		}
        node.Next=&ListNode{}
        node =node.Next
	}
	return head
}