之前没有提交通过,主要可能是因为没有理解leetcode网站上的链表是从头节点开始存数据的,今天又重新看了一下,重新提交后通过;
需要解决的最棘手的问题是[9] +[2,9]这样的输入;
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
struct ListNode* l3, *pnew, *tail,*p;
l3 = (struct ListNode*)malloc(sizeof(struct ListNode));//创建头节点。
int tmp = 0;
int flag = 1;
if (l3 == NULL) { //创建失败返回
printf("创建失败!");
return NULL;
}
l3->next = NULL; //头节点指针域置NULL
tail = l3; // 开始时尾指针指向头节点 将新建的头节点当做最后一个节点
while ((l1 != NULL) || (l2 != NULL) || (tmp != 0))//满足其中一个条件就继续
{ //创建链表
pnew = (struct ListNode*)malloc(sizeof(struct ListNode)); //创建新节点
if (pnew == NULL) { //创建失败返回
printf("创建失败!");
return NULL;
}
if (l1 != NULL&&l2 != NULL)
{
pnew->val = l1->val + l2->val + tmp;
tmp = 0;
}
if (l1 == NULL&l2 == NULL&tmp!=0)//两个链表节点数相等,到最后一个节点后产生进位
{
pnew->val = tmp;
tmp = 0;
}
if (l1!=NULL&&l2==NULL)//flag2 == 1
{
pnew->val = l1->val + tmp;
tmp = 0;
}
if (l1 == NULL&&l2 != NULL)
{
pnew->val = l2->val + tmp;
tmp = 0;
}
if (l1 == NULL&l2 == NULL&&tmp != 0)
{
pnew->val = tmp;
tmp = 0;
}
if (pnew->val >= 10)
{
pnew->val = pnew->val - 10;
tmp = 1;
}
pnew->next = NULL; //新节点指针域置NULL 当前新建的节点的指针域指向NULL
tail->next = pnew; //新节点插入到表尾 上一个节点的指针域指向当前新建的节点
tail = pnew; //为指针指向当前的尾节点,将当前新建的节点当做最后一个节点
if (l1 != NULL&&l2 != NULL)
{
l1 = l1->next;
l2 = l2->next;
}
else if (l1 == NULL&l2 == NULL)//保证while可以进来
{
l1 = l1;
l2 = l2;
}
else if (l1 != NULL&&l2 == NULL)
{
l1 = l1->next;
l2 = l2;
}
else
{
l1 = l1;
l2 = l2->next;
}
}
return l3->next;
}