我是小小强,这是我的第8篇原创文章,阅读需要大约10分钟。
题目
LintCode:链表求和
描述
你有两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中相反的顺序,使得第一个数字位于链表的开头。写出一个函数将两个整数相加,用链表形式返回和。
样例
给出两个链表 3->1->5->null
和5->9->2->null
,返回8->0->8->null
思路
题目中要求从链表头节点开始,按位相加,同时进位。那就可以构造一个链表,存放相加结果,同时用一个临时变量存放链表相加之和,如果大于10,则设置进位标志。最后结束时判断进位标志是否为0,不为0,则需要再进位。
实现
- java实现
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
/**
* @param l1: the first list
* @param l2: the second list
* @return: the sum list of l1 and l2
*/
public ListNode addLists(ListNode l1, ListNode l2) {
// write your code here
int flag = 0;
int a = 0;
ListNode ln = new ListNode(0);
ListNode tmpln = ln, tmpl1 = l1, tmpl2 = l2, tmp = null;
if (l1 == null){
return l2;
}
if (l2 == null){
return l1;
}
if (l1 == null && l2 == null) {
return null;
}
while (tmpl1 != null || tmpl2 != null){
if (tmpl1 != null){
a += tmpl1.val;
}
if (tmpl2 != null){
a += tmpl2.val;
}
if (flag > 0) {
a += flag;
}
if( a>=10 ) {
flag = 1;
a -= 10;
}
else
flag = 0;
tmp = new ListNode(a);
tmpln.next = tmp;
tmpln = tmp;
tmpln.next = null;
a = 0;
if (tmpl1 != null)
tmpl1 = tmpl1.next;
if (tmpl2 != null)
tmpl2 = tmpl2.next;
}
if (flag > 0){
tmp = new ListNode(1);
tmpln.next = tmp;
}
return ln.next;
}
}
- 结果分析
结果:结果通过了LintCode的要求。
分析:这种实现比较好理解,但是实现起来却没什么巧妙之处。
其它优化参考
优秀代码
public class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode c1 = l1;
ListNode c2 = l2;
ListNode sentinel = new ListNode(0);
ListNode d = sentinel;
int sum = 0;
while (c1 != null || c2 != null) {
sum /= 10;
if (c1 != null) {
sum += c1.val;
c1 = c1.next;
}
if (c2 != null) {
sum += c2.val;
c2 = c2.next;
}
d.next = new ListNode(sum % 10);
d = d.next;
}
if (sum / 10 == 1)
d.next = new ListNode(1);
return sentinel.next;
}
}