两数相加 【LeetCode 链表】

给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。

你可以假设除了数字 0 之外,这两个数字都不会以零开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

思路:在创建一个新的链表,然后再新链表中进行操作,需要记录两数和来自前一位的进位,并保存当前位的进位,主要细节有二:一是第一个节点不保存结果,只是存储头节点,二是如果一个链表结束了,另一个仍要继续运算。

public class Main {
//    static class ListNode {
//        int val;
//        ListNode next;
//        ListNode(int x) {
//            val = x;
//            next = null;
//        }
//    }
    public static void main(String[] args) {
        ListNode n1 = new ListNode(2);
        n1.next=new ListNode(4);
        n1.next.next=new ListNode(3);

        ListNode n2=new ListNode(5);//B链表
        n2.next=new ListNode(6);
        n2.next.next=new ListNode(4);

        System.out.println(addTwoNumbers(n1,n2).val);
    }
    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode res=new ListNode(0);
        ListNode curr=res;

        ListNode listA=l1;
        ListNode listB=l2;
        int flag=0;
        while(listA!=null || listB!=null){  如果一个结束了,另一个继续遍历,这一点比较好
            int v1 = (listA == null) ? 0 : listA.val;
            int v2 = (listB == null) ? 0 : listB.val;
            int ans = v1 + v2 + flag;
            if (ans >= 10) {
                flag = ans / 10;
                ans = ans % 10;
            }else {
                flag=0;
            }
            curr.next = new ListNode(ans);
            curr = curr.next;

            listA = (listA == null) ? listA : listA.next; //如果listA已经为空了,那么还等于
                                                          //它本身
            listB = (listB == null) ? listB : listB.next;
        }

        if(flag>0){
            curr.next=new ListNode(flag);
        }
        return res.next;
    }
}
发布了225 篇原创文章 · 获赞 30 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_35634181/article/details/83150593
今日推荐