[容易]167.链表求和

我是小小强,这是我的第8篇原创文章,阅读需要大约10分钟。


题目

LintCode:链表求和

描述

你有两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中相反的顺序,使得第一个数字位于链表的开头。写出一个函数将两个整数相加,用链表形式返回和。

样例

给出两个链表 3->1->5->null5->9->2->null,返回8->0->8->null

思路

题目中要求从链表头节点开始,按位相加,同时进位。那就可以构造一个链表,存放相加结果,同时用一个临时变量存放链表相加之和,如果大于10,则设置进位标志。最后结束时判断进位标志是否为0,不为0,则需要再进位。

实现

  1. java实现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    /**
    * 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;
    }
    }
  2. 结果分析
    结果:结果通过了LintCode的要求。
    分析:这种实现比较好理解,但是实现起来却没什么巧妙之处。

其它优化参考

LeetCode discuss

优秀代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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;
}
}
坚持原创技术分享,您的支持将鼓励我继续创作!