自学内容网 自学内容网

2. 两数相加

https://leetcode.cn/problems/add-two-numbers/description/?envType=study-plan-v2&envId=top-100-liked
我们很容易想到用一个变量surpass记录进位,然后从后往前遍历,但是这样需要处理很多边界情况,所以我们再指定尾节点tail,然后从前往后遍历,这样只需要处理一个边界情况,就是某一条链表遍历完了但另一条还没有,我们让tail等于遍历完的链表的尾部然后将剩余的节点接上去就行.

public class Solution {
    public static class ListNode {
        int val;
        Solution.ListNode next;

        ListNode(int x) {
            val = x;
            next = null;
        }
    }
    public static void main(String[] args) {
        int[] arr1 = {2,4,9};
        int[] arr2 = {5,6,4,9};
        ListNode head1 = new ListNode(arr1[0]);
        ListNode currNode = head1;
        for (int i = 1; i < arr1.length; i++) {
            ListNode node = new ListNode(arr1[i]);
            currNode.next = node;
            currNode = node;
        }
        ListNode head2 = new ListNode(arr2[0]);
        currNode = head2;
        for (int i = 1; i < arr2.length; i++) {
            ListNode node = new ListNode(arr2[i]);
            currNode.next = node;
            currNode = node;
        }
        new Solution().addTwoNumbers(head1, head2);
    }
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        // 定义进位
        int surpass = 0;
        // 定义两个指针,分别指向两个链表的头节点
        ListNode curr1 = l1, curr2 = l2, tail = null;
        // 当两个链表都不为空时,进行循环
        while(curr1 != null && curr2 != null){
            // 计算两个节点的和,加上进位
            int sum = curr1.val + curr2.val + surpass;
            // 计算进位
            surpass = sum / 10;
            // 计算当前节点的值
            sum = sum % 10;
            // 将当前节点的值赋给curr1
            curr1.val = sum;
            // 将tail指向curr1
            tail = curr1;
            // 将curr1指向下一个节点
            curr1 = curr1.next;
            // 将curr2指向下一个节点
            curr2 = curr2.next;
        }
        // 当curr1不为空时,进行循环
        while(curr1 != null){
            // 计算当前节点的和,加上进位
            int sum = curr1.val + surpass;
            // 计算进位
            surpass = sum / 10;
            // 计算当前节点的值
            sum = sum % 10;
            // 将当前节点的值赋给curr1
            curr1.val = sum;
            // 将tail的下一个节点指向curr1
            tail.next = curr1;
            // 将tail指向curr1
            tail = curr1;
            // 将curr1指向下一个节点
            curr1 = curr1.next;
        }
        // 当curr2不为空时,进行循环
        while(curr2 != null){
            // 计算当前节点的和,加上进位
            int sum = curr2.val + surpass;
            // 计算进位
            surpass = sum / 10;
            // 计算当前节点的值
            sum = sum % 10;
            // 将当前节点的值赋给curr2
            curr2.val = sum;
            // 将tail的下一个节点指向curr2
            tail.next = curr2;
            // 将tail指向curr2
            tail = curr2;
            // 将curr2指向下一个节点
            curr2 = curr2.next;
        }
        // 如果还有进位,则创建一个新的节点,并将tail的下一个节点指向该节点
        if(surpass != 0){
            tail.next = new ListNode(surpass);
        }
        // 返回l1
        return l1;
    }
}


原文地址:https://blog.csdn.net/release_lonely/article/details/143893946

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!