* 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; }