2. 两数相加(中等,链表)

中文版本

题目

难度:中等

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

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

示例:

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

解题思路

这题比较简单,直接用进位法做就可以了,但是边界条件还需要考虑清楚:

  • 当一个列表比另一个列表长时

l1=[0,1],l2=[0,1,2],l2=[0,1,2]

  • 当一个列表为空时,即出现空列表

l1=[],l2=[0,1],l2=[0,1]

  • 求和运算最后可能出现额外的进位,这一点很容易被遗忘

l1=[9,9],l2=[1],l2=[1]

代码

Python3

# 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:
        dummy_head = ListNode(0)
        curr = dummy_head
        carry = 0
        
        while l1 is not None or l2 is not None:
                
            val1 = l1.val if l1 is not None else 0
            val2 = l2.val if l2 is not None else 0

            sum = carry + val1 + val2
            curr.next = ListNode(sum % 10)
            curr = curr.next

            carry = 0 if sum < 10 else 1
            
            l1 = l1.next if l1 is not None else None
            l2 = l2.next if l2 is not None else None
            
        if carry > 0:
            curr.next = ListNode(carry)
            
        return dummy_head.next

Java

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    ListNode dummyHead = new ListNode(0);
    ListNode p = l1, q = l2, curr = dummyHead;
    int carry = 0;
    while (p != null || q != null) {
        int x = (p != null) ? p.val : 0;
        int y = (q != null) ? q.val : 0;
        int sum = carry + x + y;
        carry = sum / 10;
        curr.next = new ListNode(sum % 10);
        curr = curr.next;
        if (p != null) p = p.next;
        if (q != null) q = q.next;
    }
    if (carry > 0) {
        curr.next = new ListNode(carry);
    }
    return dummyHead.next;
}

Go

func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
    dummyHead := &ListNode{0, nil}
    p, q, curr := l1, l2, dummyHead
    carry := 0
    for p != nil || q != nil {
        var x, y int
        if p != nil {
            x = p.Val
        } else {
            x = 0
        }
        if q != nil {
            y = q.Val
        } else {
            y = 0
        }
        sum := x + y + carry
        curr.Next = &ListNode{sum % 10, nil}
        curr = curr.Next
        if p != nil {
            p = p.Next
        } else {
            p = nil
        }
        if q != nil {
            q = q.Next
        } else {
            q = nil
        }
        if sum >= 10 {
            carry = 1
        } else {
            carry = 0
        }
    }
    if carry == 1 {
        curr.Next = &ListNode{1, nil}
    }
    return dummyHead.Next
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只...
    习惯了_就好阅读 1,540评论 0 0
  • 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只...
    罗健伦阅读 1,441评论 0 0
  • 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只...
    多彩海洋阅读 1,765评论 1 1
  • 搞懂单链表常见面试题 Hello 继上次的 搞懂基本排序算法,这个一星期,我总结了,我所学习和思考的单链表基础知识...
    醒着的码者阅读 10,074评论 1 45
  • 当我穿上肉色保暖衣那一刻, 才知道该来的躲不掉。 早睡、运动、喜欢blingbling、喜欢粉色、喜欢基本款、接受...
    姐说员阅读 1,603评论 0 0

友情链接更多精彩内容