算法题-第二周
1.两数相加
给你两个「非空」的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例1
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例2:
输入:l1 = [0], l2 = [0]
输出:[0]
示例3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
解题思路演进:
考虑先将短链表补0对齐长链表,需要计算两个链表的长度,然后在短链表尾部添加0,最后翻转去相加(过于复杂)
-> 先翻转两个链表,再从链头开始取出值拼成字符串,再转换成整型,将两个值相加,再倒叙生成新链表(由于链表长度可能是*100,整型放不下,long 都放不下)
-> 查看他人解题思路,由于是已经翻转的链表,所以从头结点开始相加就是低位开始相加,只要两个链表其中一个的后继节点有值就可以不断取出求和,另一个链表为空则取 0,再与进位相加。结果除 10 为进位,结果取余为新结点的值
kotlin代码
1 | fun addTwoNumbers(l1: ListNode?, l2: ListNode?): ListNode? { |
2.反转链表
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
kotlin代码
1 | fun reverseList(head: ListNode?): ListNode? { |
