Add Two Numbers Total Accepted: 58281 Total Submissions: 266931 My Submissions Question Solution
You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
这一题应该算是比较简单的题目,题目大概的意思是给你两个链表,将这两个链表中对应位置的节点求和,如果该处和大于10则进位,然后输出和链表。
思路使用尾插法新建出一个和链表就可以了。思路是这么简单,但这一题却有许多特殊情况要考虑
- 一个链表长一个链表短的情况
- 最后一个节点处有进位的情况
- 不等长链表最后一个节点处有进位的情况
处理好这三种情况就差不多AC了。下面是代码:
public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode temp = new ListNode(0);
// 记录下头结点,尾插法构建和链表
ListNode head = temp;
// 进位标记
int flag = 0;
int delete = 0;
while (l1!= null || l2!= null) {
// 处理链表不等长
if (l1 == null) {
// 处理进位
l2.val = l2.val+flag;
flag = 0;
// 处理不等长节点最后进位情况
if (l2.val >=10) {
delete = -10;
flag = 1;
}
ListNode l3 = new ListNode(l2.val+delete);
delete = 0;
temp.next = l3;
temp = l3;
l2 = l2.next;
}
else if (l2 == null) {
l1.val = l1.val + flag;
flag = 0;
if (l1.val >=10) {
delete = -10;
flag = 1;
}
ListNode l3 = new ListNode(l1.val+delete);
delete = 0;
temp.next = l3;
temp = l3;
l1 = l1.next;
}
else {
l1.val = l1.val + flag;
flag = 0;
if (l1.val+l2.val>=10) {
delete = -10;
flag = 1;
}
ListNode l3 = new ListNode(l1.val+l2.val+delete);
delete = 0;
temp.next = l3;
temp = l3;
l1 = l1.next;
l2 = l2.next;
}
// 处理最后一个节点有进位情况
if (flag ==1 && l1 ==null && l2 ==null) {
ListNode l3 = new ListNode(1);
temp.next = l3;
temp = l3;
}
}
temp.next = null;
return head.next;
}
其实挺烦的,每刷一个题要2,3个小时,感觉好消耗时机。处理问题的时候总是考虑不全面,这些特例都是通过Leetcode给失败反馈找出来的,要是不给反馈,这些例子怎么找到的?肯定要花更长的时间。
真是烦,实习又没有找到,感觉自己欠缺的还挺多的,哎,时间都去哪了啊。