Add Two Numbers

解法一:

思路很简单:

先遍历两个单链表,分别组成两个数,相加后得到和,再把和倒序插入单链表即可

注意两点:

1. 单链表组成的数可能会超过int范围,所有操作数都用long类型

2. 单链表在表尾插入节点,基础啊,大哭,这都想了老半天,太差

public class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        long a = 0,b=0,temp =1;	
    	while(l1 != null){
    	   a = temp*l1.val+a;
    	   l1 = l1.next;
    	   temp = temp*10;
    	}
    	temp =1;
    	while(l2 != null){
    	   b = temp*l2.val+b;	
    	   l2 = l2.next;
    	   temp = temp*10;
    	}
    	long c = a+b;
    	ListNode l3 = new ListNode((int)(c%10));
    	c=c/10;
    	while(c>0){
    	    insert(l3,(int)(c%10));
    	    c=c/10;
    	}
    	return l3;
    }

    public void insert(ListNode l3,int i){
    	ListNode tail = l3.next;
    	if(tail != null){
        	while(tail.next != null){
        		tail = tail.next;
        	}
    	}else{
    	   tail =  l3;
    	}
    	ListNode node = new ListNode(i);
    	tail.next = node;
    	tail=tail.next;
    }

解法二:

上述解法的复杂度为O(3n),由于题目的特殊性,两个数都是逆序存储的,要求输出的结果也是逆序。可以直接一个循环就可以解决,复杂度为O(n)。

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode rootNode(0);//构造一个头结点
        ListNode *pCurNode = &rootNode;
        int a = 0;//代表进位
        while (l1 || l2)
        {
            int v1 = (l1 ? l1->val : 0);
            int v2 = (l2 ? l2->val : 0);
            int temp = v1 + v2 + a;
            a = temp / 10;
            ListNode *pNode = new ListNode((temp % 10));
            pCurNode->next = pNode;
            pCurNode = pNode;
            if (l1)
                l1 = l1->next;
            if (l2)
                l2 = l2->next;
        }
        if (a > 0)
        {
            ListNode *pNode = new ListNode(a);
            pCurNode->next = pNode;
        }
        return rootNode.next;
    }
变量a是进位,注意要构造头节点。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值