菜鸡每日一题系列打卡2天
每天一道算法题目
小伙伴们一起留言打卡
坚持就是胜利,我们一起努力!
题目描述(引自LeetCode)
给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
题目分析
题目为典型的初等数学知识。搞清楚加法与进位,遍历链表的结点并进行相应的操作即可。注意一点,题目中链表存放的整数各自的位数是按照逆序的方式存储的,若是顺序存储,则需先反转链表,再进行加法运算,最后将所得结果再次反转即可。
代码实现
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
// 结果的头结点(非首元结点)
ListNode result = new ListNode(0);
// 临时引用变量
ListNode tmp1 = l1;
ListNode tmp2 = l2;
ListNode tmp = result;
// 进位变量
int carry = 0;
// 两个链表的引用均为非空时
while (tmp1 != null && tmp2 != null) {
int sum = carry + tmp1.val + tmp2.val;
carry = sum / 10;
tmp.next = new ListNode(sum % 10);
tmp = tmp.next;
tmp1 = tmp1.next;
tmp2 = tmp2.next;
}
// l1长度大于l2时
while (tmp1 != null) {
int sum = carry + tmp1.val;
carry = sum / 10;
tmp.next = new ListNode(sum % 10);
tmp = tmp.next;
tmp1 = tmp1.next;
}
// l2长度大于l1时
while (tmp2 != null) {
int sum = carry + tmp2.val;
carry = sum / 10;
tmp.next = new ListNode(sum % 10);
tmp = tmp.next;
tmp2 = tmp2.next;
}
// 处理可能的进位
if (carry == 1) {
tmp.next = new ListNode(1);
}
// 返回首元结点
return result.next;
}
}
代码分析
根据代码,算法执行次数与需要的额外空间均与l1和l2的长度有关。设l1与l2的长度分别为m,n,则算法的时间复杂度为O(max(m, n));需要的空间复杂度为O(max(m,n))。
执行结果
关注公众号有理想的菜鸡,和菜鸡的小伙伴们一起打卡吧!