美文网首页
[容易]167.链表求和

[容易]167.链表求和

作者: 我叫小小强 | 来源:发表于2017-07-05 23:11 被阅读43次

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


题目

LintCode:链表求和

描述

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

样例

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

思路

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

实现

  1. 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;
    }
}
  1. 结果分析
    结果:结果通过了LintCode的要求。
    分析:这种实现比较好理解,但是实现起来却没什么巧妙之处。

其它优化参考

LeetCode discuss

优秀代码

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;
    }
}

相关文章

  • [容易]167.链表求和

    我是小小强,这是我的第8篇原创文章,阅读需要大约10分钟。 题目 LintCode:链表求和 描述 你有两个用链表...

  • 167. 链表求和

    你有两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中相反的顺序,使得第一个数字位于链表的开...

  • LintCode:167. 链表求和

    你有两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中相反的顺序,使得第一个数字位于链表的开...

  • LintCode - 链表求和(容易)

    版权声明:本文为博主原创文章,未经博主允许不得转载。 难度:容易 要求: 假定用一个链表表示两个数,其中每个节点仅...

  • 链表 求和

    给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只...

  • 每日Leetcode—算法(14)

    141.环形链表 算法(快慢指针): 155.最小栈 算法一: 算法二: 167. 两数之和 II - 输入有序数...

  • 2020-08-15 链表求和

    1. 链表求和 反向求和,比较简单,从左到右扫描就可以

  • 数据结构算法相关题(LeetCode相关问题)

    1. 斐波那契数列求和 斐波那契数列(0,1,1,2,3,5 . . .)求和 反转链表(反转链表[https:...

  • 一篇文章搞定面试中的链表题目(java实现)

    废话少说,上链表的数据结构 1.翻转链表 2.判断链表是否有环 3,链表排序 4.链表相加求和 5.得到链表倒数第...

  • 链表算法题集合(java实现)

    链表的数据结构 1.翻转链表 2.判断链表是否有环 3,链表排序 4.链表相加求和 5.得到链表倒数第n个节点 6...

网友评论

      本文标题:[容易]167.链表求和

      本文链接:https://www.haomeiwen.com/subject/mndchxtx.html