面试题 02.05. 链表求和

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
给定两个用链表表示的整数每个节点包含一个数位

这些数位是反向存放的也就是个位排在链表首部

编写函数对这两个整数求和并用链表形式返回结果

 

示例

输入(7 -> 1 -> 6) + (5 -> 9 -> 2)即617 + 295
输出2 -> 1 -> 9即912
进阶假设这些数位是正向存放的请再做一遍

示例

输入(6 -> 1 -> 7) + (2 -> 9 -> 5)即617 + 295
输出9 -> 1 -> 2即912

来源力扣LeetCode
链接https://leetcode-cn.com/problems/sum-lists-lcci
著作权归领扣网络所有商业转载请联系官方授权非商业转载请注明出处
题解:

串链表

  • 初始化 newHead 作为新链表的虚拟头结点
  • 变量carry 记录是否上一个值有无进位
  • 当L1 或者 L2不为空时,遍历L1, L2
  • 当前sum = L1.val + L2.val + carry. 当然当L1 或者 L2 为空时,其值为0
  • 根据sum创建节点,拼接在newHead上
  • 遍历完毕,如果carry > 0, 代表末尾需要拼上 carry
  • 最终返回 newHead.next

代码如下:

 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
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

        ListNode newHead = new ListNode(-1);
        ListNode node = newHead;
        int carry = 0;
        while (l1 != null || l2 != null){
            int sum = (l1 == null ? 0 : l1.val) + (l2 == null ? 0 : l2.val) + carry;
            carry = 0;
            if (sum >= 10){
                sum -= 10;
                carry = 1;
            }

            node.next = new ListNode(sum);
            node = node.next;

            l1 = l1 == null ? null : l1.next;
            l2 = l2 == null ? null : l2.next;
        }

        if (carry > 0){
            node.next = new ListNode(carry);
        }

        return newHead.next;
    }

时间复杂度: O(N) 空间复杂度: O(N)

屏幕快照 2020-05-14 下午5.04.33