LeetCode之2:Add Two Numbers
问题描述:

将两个个位数数字组成的链表合并为一个,模拟加法器。
问题的陷阱:
在考虑进位问题时想的不全名,漏掉两个链表最终同时为空,而产生进位,导致最终少加一位数这一问题。
缺陷代码分析
/**
* 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) {
int adding = 0;
ListNode head = new ListNode(0);
ListNode current = head;
while(l1!=null || l2!= null) {
current.next = new ListNode(0);
current = current.next;
int sum = adding + (l1==null ? 0 : l1.val) + (l2==null ? 0 : l2.val);
if (sum >= 10)
adding = 1;
else
adding = 0;
current.val = sum % 10;
l1 = l1==null ? null : l1.next;
l2 = l2==null ? null : l2.next;
if (l1==null && l2==null && adding==1) {
current.next = new ListNode(1);
current = current.next;
}
}
return head.next;
}
}
主要思路是在while 循环中不断将两个链表的值相加,保存到新的链表节点中,直到两个链表均为空。
- 在while中有很多重复操作:假如一个链表比另一个长得多,那么对于其中的空链表就有了很多不必要的判断其是否为空的操作,拉低了执行时间。
- 在开头就可以尝试判断其中是否有链表为空,直接将另一个非空链表返回。
- 最终一个链表为空时,可以直接转化为对另一个非空链表的操作,提高效率。
改进后的版本:
/**
* 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) {
int adding = 0;
if(l1==null)
return l2;
if(l2==null)
return l1;
ListNode head = new ListNode(0);
ListNode current = head;
while(l1!=null && l2!= null) {
current.next = new ListNode(0);
current = current.next;
int sum = adding + l1.val + l2.val;
if (sum >= 10)
adding = 1;
else
adding = 0;
current.val = sum % 10;
l1 = l1.next;
l2 = l2.next;
}
if (l1==null && l2==null && adding==1) {
current.next = new ListNode(1);
current = current.next;
}
while (l1!=null) {
int sum = (l1.val+adding);
current.next = new ListNode(sum%10);
adding = sum>=10 ? 1 : 0;
current = current.next;
l1 = l1.next;
if (l1==null && adding==1) {
current.next = new ListNode(1);
current = current.next;
}
}
while (l2!=null) {
current.next = new ListNode((l2.val+adding)%10);
adding = (l2.val + adding) >= 10 ? 1 : 0;
current = current.next;
l2 = l2.next;
if (l2==null && adding==1) {
current.next = new ListNode(1);
current = current.next;
}
}
return head.next;
}
}

本文深入探讨了LeetCode题目2:AddTwoNumbers的解决策略,解析了处理链表加法时易忽视的进位问题,并提出了一种更高效的算法实现。通过对比分析,优化后的版本减少了冗余操作,显著提升了执行效率。
156

被折叠的 条评论
为什么被折叠?



