关于leetcode中链表中两数据相加的程序说明

* Definition for singly-linked list.  
 * struct ListNode {  
 *     int val;  
 *     struct ListNode *next;  
 * };  
 */  
   
typedef struct ListNodep {  
     int val;  
     struct ListNodep *next;  
 }ListNode;  
   
   
ListNode* addTwoNumbers(ListNode* I1, ListNode* I2) {  
    ListNode *rootp = NULL;  
    ListNode *listp = NULL;  
    int value = 0;  
    int varin = 0;  
      
    if(I1 == NULL && I2 == NULL) return rootp;  
      
    listp = (ListNode *)malloc(sizeof(ListNode));  
    rootp = listp;  
    listp->val = 0;  
    listp->next = NULL;  
      
    while(I1 != NULL || I2 != NULL || varin!= 0){  
          
        if(I1 == NULL && I2 != NULL)  value = I2->val + varin;  
          
        if(I1 != NULL && I2 == NULL)  value = I1->val + varin;  
          
        if(I2 != NULL && I1 != NULL)  value = I1->val + I2->val + varin;  
          
        if(I1 == NULL && I2 == NULL)  value = varin;  
                  
        varin = 0;  
          
        if(value >= 10){  
            varin = value /10;  
            value = value %10;  
        }  
  
        //此处需要注意,此处需要注意当当前链表已经为NULL后,他指向的空链表  
        //不能够在往下操作了,需要直接在给当前指针为空链表  
        if(I1 == NULL) I1 = NULL;  
        else I1 = I1->next;  
          
        if(I2 == NULL) I2 = NULL;  
        else I2 = I2->next;  
          
          
        listp->val = value;  
          
        if(I1 != NULL || I2 != NULL || varin != 0){  
            listp->next = (ListNode *)malloc(sizeof(ListNode));  
            listp = listp->next;}  
        else  
        {  
            listp->next = NULL;  
        }  
    }  
      
    return rootp;  
}  

  

leetcode问题描述 : 

 

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、如果两个链表长度是一样的,就将链表中的元素相加输出即可

 

2、如果两个链表的长度不是一样的,就要短链表位的补齐,如果不是使用补齐的方法,就需要考虑在逻辑上消除这种现象

 

3、如果两个链表长度一样长,但是在最后一个元素相加出现了进位,那么就需要在最后一个链表上在添加一个链表,

所以其实这个问题还是蛮复杂的

 

下面是在c中运行时的代码 : 

 

// list.cpp : 定义控制台应用程序的入口点。  
//  
#include "stdafx.h"  
#include "stdio.h"  
#include "stdlib.h"  
#define ListDeep 1  
typedef struct NODE{  
NODE *P;  
int data;  
}ListTypr;  
ListTypr list1[ListDeep];  
ListTypr list2[ListDeep];  
//---------------------------------------------------------------  
void initlist(ListTypr *I1 , ListTypr *I2 , int listdeep){  
for(short i = 0; i < listdeep ; i++){  
I1->data=5;  
if(i == listdeep-1) I1->P= NULL;  
else I1->P= I1+1;  
I1 = I1->P;  
}  
for(short i = 0; i < listdeep ; i++){  
I2->data=5;  
if(i == listdeep-1) I2->P= NULL;  
else I2->P= I2+1;  
I2 = I2->P;  
}  
}  
ListTypr* addTwoNumbers(ListTypr* l1, ListTypr* l2) {  
ListTypr *rootp = NULL;  
ListTypr *listp = NULL;  
int value = 0;  
int varin = 0;  
if(l1 == NULL && l2 == NULL) return rootp;  
listp = (ListTypr *)malloc(sizeof(ListTypr));  
listp->data = 0;  
listp->P = NULL;  
rootp = listp;  
while(l1 != NULL || l2 != NULL || varin != 0){  
if(l1 != NULL && l2 == NULL) value = l1->data + varin;  
if(l1 == NULL && l2 != NULL) value = l2->data + varin;  
if(l1 != NULL && l2 != NULL) value = l1->data + l2->data + varin;  
if(l1 == NULL && l2 == NULL) {  
value = varin;  
varin = 0;  
}  
if(value >= 10){  
varin = value / 10;  
value = value % 10;  
}  
if(l1 == NULL) l1 = NULL;  
else l1 = l1->P;  
if(l2 == NULL) l2 = NULL;  
else l2 = l2->P;  
listp->data = value;  
if(l1 != NULL || l2 != NULL || varin != 0){  
listp->P = (ListTypr *)malloc(sizeof(ListTypr));  
listp = listp->P;}  
else{  
listp->P = NULL;  
}  
}  
return rootp;  
}  
int _tmain(int argc, _TCHAR* argv[])  
{  
short listdeep = ListDeep;  
ListTypr * plistresult = NULL;  
ListTypr * rep = NULL;  
int resultmatrix[10];  
short i = 0;  
initlist(&list1[0] , &list2[0] , listdeep);  
plistresult = addTwoNumbers(&list1[0] , &list2[0]);  
while(plistresult != NULL){  
resultmatrix[i] = plistresult->data;  
plistresult = plistresult->P;  
i = i + 1;  
}  
while(1);  
return 0;  
}  

 

posted @ 2016-12-15 16:08  havihouston  阅读(1269)  评论(0编辑  收藏  举报