两链表相加

1:题目描述

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

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

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

示例:

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

2:题目分析与答题思路

  • 分析:题目是意思是让我们对两个链表进行十进制加法操作,我们可以仿照整数的方式进行处理,从低到高进行相加,然后再调整进位的处理即可。注意由于链表长度没有限制,所以不能通过转化成整型数直接相加,然后再整理成链表的方式,因为最长的long的长度也是有限的!
  • 思路:首先将两个链表从低到高相加,不管进位,一直加到其中有一个链表为null,然后在长的链表里进行进位的调整。

3:代码实现

//直接再链表上操作
class planB{
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode n1 = l1;
        ListNode n2 = l2;
        int l1Lenth = 0;
        int l2Lenth = 0;
        ListNode temp1 = l1;
        ListNode temp2 = l2;
        ListNode end1 = null;
        ListNode end2 = null;
        while(true){
            if(temp1 == null&&temp2!=null){
                l1Lenth = 0;
                l2Lenth = 1;
                break;
            }
            if(temp1 != null&&temp2==null){
                l1Lenth = 1;
                l2Lenth = 0;
                break;
            }
            if(temp1 == null&&temp2==null){
                l1Lenth = l1Lenth;
                break;
            }
            if(temp1 == null&&temp2==null){
                l1Lenth = l1Lenth;
                break;
            }
            temp1 = temp1.next;
            temp2 = temp2.next;
            }

        //按节点相加,不管进位
        while(true){
            if(n1==null||n2==null){
                break;
            }
            addTwoNodes(n1,n2);
            n1 = n1.next;
            n2 = n2.next;
        }


        n1 = l1;
        n2 = l2;
        //调整长度较长的链表的进位,
        if(l1Lenth>=l2Lenth){//调整长度较长的链表l1的进位,
            while(true){
                if(n1 == null){
                    break;
                }
                else {
                    if(n1.val>=10){
                        if(n1.next !=null) {
                            n1.next.val++;
                        }
                        else{
                            n1.next = new ListNode(1);
                        }
                        n1.val = n1.val-10;
                    }
                }
                n1 = n1.next;
            }
        }
        else{//或者调整长度较长的链表l2的进位,
            while(true){
                if(n2 == null){
                    break;
                }
                else {
                    if(n2.val>=10){
                        if(n2.next !=null) {
                            n2.next.val++;
                        }
                        else{
                            n2.next = new ListNode(1);
                        }
                        n2.val = n2.val-10;
                    }
                }
                n2 = n2.next;
            }
        }
        return l1Lenth>=l2Lenth?l1:l2;

    }

    //遍历较长的链表,在长链表上进行操作,假设n1是较长链表的节点
    public void addTwoNodes(ListNode n1,ListNode n2){
        int sum = n1.val+n2.val;
            n1.val = sum;
            n2.val = sum;
    }

}

猜你喜欢

转载自www.cnblogs.com/dazhu123/p/12395013.html