【LeetCode刷题记录】20.链表求和

126 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

题目来源:LeetCode-链表求和

给定两个用链表表示的整数,每个节点包含一个数位。

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

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

 

示例:

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

输出:2 -> 1 -> 9,即912

进阶:思考一下,假设这些数位是正向存放的,又该如何解决呢?

示例:

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

输出:9 -> 1 -> 2,即912

二、思路分析:

思路一:

  1. 常规解法,遍历两个链表进行求和,并使用新的链表保存计算的结果,只需要遍历一次即可

思路二:

  1. 遍历两链表,将结点值依次相加存放在结果链表中
  2. 其中一条遍历完成直接将另一条剩余部分连接到结果链表尾部
  3. 再遍历结果链表,结点值大于10就进位,分最后一位存在或者不存在,存在结点值直接加1,不存在就创建一个新结点存放进位值
  4. 再将它连接到结果链表后面,最后将结果链表返回即可

三、AC 代码:

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    int inNum = 0;
    int mod = 0;
    ListNode pointer1 = l1;
    ListNode pointer2 = l2;
    ListNode result = new ListNode(-1);
    ListNode answer = result;
    while (pointer1 != null && pointer2 != null) {
        int temp = pointer1.val + pointer2.val + inNum;
        inNum = temp / 10;
        mod = temp % 10;
        answer.next = new ListNode(mod);
        answer = answer.next;
        pointer1 = pointer1.next;
        pointer2 = pointer2.next;
    }
    
    while (true) {
        if (pointer1 == null) break;
        int temp = pointer1.val + inNum;
        inNum = temp / 10;
        mod = temp % 10;
        answer.next = new ListNode(mod);
        answer = answer.next;
        pointer1 = pointer1.next;
    }
    while (pointer2 != null) {
        int temp = pointer2.val + inNum;
        inNum = temp / 10;
        mod = temp % 10;
        answer.next = new ListNode(mod);
        answer = answer.next;
        pointer2 = pointer2.next;
    }
    if (inNum > 0) {
        answer.next = new ListNode(inNum);
    }
    return result.next;
}

非递归实现法:

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    ListNode headNode = new ListNode(0);
    ListNode previousNode = headNode;
    int carryNum = 0;
    while (l1 != null || l2 != null || carryNum != 0) {
        int sum = (l1 != null ? l1.val : 0) + (l2 != null ? l2.val : 0) + carryNum;
        carryNum = sum / 10;
        previousNode.next = new ListNode(sum % 10);
        previousNode = previousNode.next;
        l1 = l1 != null ? l1.next : l1;
        l2 = l2 != null ? l2.next : l2;
    }
    return headNode.next;
}

思路二:

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode listNode = new ListNode(l1.val + l2.val);
        ListNode result = listNode;
        l1 = l1.next;
        l2 = l2.next;
        while (l1 != null && l2 != null) {
            result.next = new ListNode(l1.val + l2.val);
            result = result.next;
            l1 = l1.next;
            l2 = l2.next;
        }
        if (l1 == null) {
            result.next = l2;
        }
        if (l2 == null) {
            result.next = l1;
        }
        return result;
    }