算法:两个链表以逆序组成数字相加

题目:

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

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

刚拿到这道题,可能的想法会是将链表以逆序恢复成两个百位数,然后将两个百位数相加,再以链表形式输出,那么时间就会浪费在链表转换成数字然后再转换成链表的过程中了。

于是,我们产生了一个想法,为什么不直接在链表的基础上进行各位的相加呢?

代码:

public ListNode addTwoNumbers(ListNode l1, ListNode l2)
{
    ListNode temp1,temp2,resultList,tail;
    tail=resultList = null;
    boolean addFlag = false;//进位标记,false代表无进位,true代表有进位
    for(temp1 = l1,temp2 = l2;temp1!=null||temp2!=null;temp1 = temp1.next,temp2 = temp2.next)
    {
    	//当两个链表长度不一致时,默认短的那个链表的那一位的数字为0
    	//例如:1->8和0相加
        if(temp1 == null)
        {
            temp1 = new ListNode(0);
        }
        if(temp2 == null)
        {
            temp2 = new ListNode(0);
        }
        int result = temp1.val+temp2.val;
        //如果上一位有进位,则要在这一位上+1,并将进位标记重新置为false
        if(addFlag)
        {
            result++;
            addFlag = false;
        }
        //相加大于等于零代表要进位
        if(result>=10)
        {
            addFlag = true;
            result-=10;
        }
        ListNode temp = resultList;
        ListNode a = new ListNode(result);
        //尾插链表节点
        if(resultList != null)
        {
            tail.next=a;
            tail = a;
        }
        else
        {
            resultList = a;
            tail=a;
        }
    }
    //当链表已经遍历完成,但是有进位,所以要创建新的一位并且这一位的数字是1 
    if(addFlag)
    {
        tail.next = new ListNode(1);
    }
    return resultList;
}

测试一下:

public static void main(String[] args)
    {
       A a = new A();
       ListNode a1 = new ListNode(1);
       ListNode a2 = new ListNode(8);
        a1.next = a2;
        ListNode b1 = new ListNode(0);
       ListNode head = a.addTwoNumbers(a1,b1);
       for(;head!=null;head = head.next)
       {
           System.out.print(head.val);
       }

    }

输出结果:
在这里插入图片描述
成功!

猜你喜欢

转载自blog.csdn.net/qq_37856300/article/details/85395775