Add Two Numbers

You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8

 

题目比较简单,不过为不同长度的数相加提供了一种思路:把数的链表先反转,然后再从前往后加,进位时向下一个节点的数据和加1.

 

    void tail(ListNode *l2,int temp){  //结尾数据进位的处理
	    while(true){
		 if(l2->next==NULL){
			    if(temp==1){
				    ListNode *c = new ListNode (1);  //这里要在堆里面分配内存,否则函数退出会被回收
				    l2->next = c;
		                 }
			   break;
		}else{  //可能会一直进位
			int a=(l2->next->val+temp)%10;
			temp=(l2->next->val+temp)/10;
			l2->next->val=a;
			l2=l2->next;
		 }
	    }
    }

    ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
	    ListNode *p=l1;
	    int temp=0;
	    while(true){
		    int current=( l1->val+l2->val+temp)%10;
		    temp=( l1->val+l2->val+temp)/10;
		    l1->val=current;
		    if(l1->next!=NULL&&l2->next!=NULL){
			    l1=l1->next;l2=l2->next;
		    }else
			    break;
	    }
	    if(l1->next==NULL&&l2->next==NULL){  //二者一样长
		    if(temp==1){
			    ListNode *c = new ListNode (1);
			    l1->next=c;
		    }
	    }else if(l1->next==NULL){  //l2长于l1,先将l2连到l1上在处理尾巴
		    int c=(l2->next->val+temp)%10;
		    temp=(l2->next->val+temp)/10;
		    l2->next->val=c;
		    l1->next=l2->next;
		    l2=l2->next;
		    tail(l2,temp);
	    }else  //l1长于l2
		    tail(l1,temp);
	    return p;
    };

 

你可能感兴趣的:(number)