一、题目
二、解题思路
(1)方法一
两个不同长度的链表其中的元素相加,题目中描述val最大为9,最小为0,也就是说两数之和的最大值是18,最小值是0。可以通过两数相除得到十分位的值,余除得到个位的值,再用一个临时变量来记录上一个十分位的值,当需要进位时用到。当一个链表较短提前遍历完时,我们可以对其中没有遍历完的链表继续遍历,来得到全部结果。
三、虚机测试代码
#include <stdio.h>
#include <stdlib.h>
struct ListNode
{
int val;
struct ListNode *next;
};
void main()
{
struct ListNode* CreateLinkList(int arr[] , int size);
void PrintfLinkList(struct ListNode* head);
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2);
int arr1[] = {2,4,3,5,3,2,7,9,2,3,5,7,5,3};
int arr2[] = {5,6,4,5,6,7,8,9,0,0,7,4,4,4,7,7,8,9,3};
int arr_size1 = sizeof(arr1) / sizeof(int);
int arr_size2 = sizeof(arr2) / sizeof(int);
struct ListNode* linklist1 = CreateLinkList(arr1 , arr_size1);
struct ListNode* linklist2 = CreateLinkList(arr2 , arr_size2);
struct ListNode* res = addTwoNumbers(linklist1,linklist2);
PrintfLinkList(linklist1);
PrintfLinkList(linklist2);
PrintfLinkList(res);
//printf("18 : %d %d\n",18/10,18%10);
//printf("9 : %d %d\n",9/10,9%10);
}
struct ListNode* CreateLinkList(int arr[] , int size)
{
struct ListNode *head,*p,*q;
int i;
head = (struct ListNode*)malloc(sizeof(struct ListNode));
p = head;
for(i=0; i<size; i++)
{
p->val = arr[i];
if(i == size - 1)
{
p->next = NULL;
}
else
{
q = (struct ListNode*)malloc(sizeof(struct ListNode));
p->next = q;
p = q;
}
}
return head;
}
void PrintfLinkList(struct ListNode* head)
{
struct ListNode *p = head;
while(p != NULL)
{
printf("val : %d , cur_p : %o ,next : %o\n",p->val,p,p->next);
p = p->next;
}
printf("=========================\n");
}
/*
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
struct ListNode *p1 = l1;
struct ListNode *p2 = l2;
int x = 0;
int y = 0;
int cnt = 0;
int tmp = 0;
struct ListNode *head,*p,*q;
head = (struct ListNode*)malloc(sizeof(struct ListNode));
p = head;
while((p1 != NULL) && (p2 != NULL))
{
cnt++;
x = ((p1->val) + (p2->val) + tmp) / 10;
y = ((p1->val) + (p2->val) + tmp) % 10;
//printf("l1,l2 || x : %d, y : %d, tmp : %d, cnt : %d\n",x,y,tmp,cnt);
p->val = y;
tmp = x;
if((p1->next != NULL) || (p2->next != NULL))
{
q = (struct ListNode*)malloc(sizeof(struct ListNode));
p->next = q;
p = q;
p1 = p1->next;
p2 = p2->next;
}
else if((p1->next == NULL) && (p2->next == NULL))
{
p->next = NULL;
p1 = p1->next;
p2 = p2->next;
}
}
while(p1 != NULL)
{
cnt++;
x = ((p1->val) + tmp) / 10;
y = ((p1->val) + tmp) % 10;
//printf("l1 || x : %d, y : %d, tmp : %d, cnt : %d\n",x,y,tmp,cnt);
p->val = y;
tmp = x;
if(p1->next != NULL)
{
q = (struct ListNode*)malloc(sizeof(struct ListNode));
p->next = q;
p = q;
p1 = p1->next;
}
else
{
p->next = NULL;
break;
}
}
while(p2 != NULL)
{
cnt++;
x = ((p2->val) + tmp) / 10;
y = ((p2->val) + tmp) % 10;
//printf("l2 || x : %d, y : %d, tmp : %d, cnt : %d\n",x,y,tmp,cnt);
p->val = y;
tmp = x;
if(p2->next != NULL)
{
q = (struct ListNode*)malloc(sizeof(struct ListNode));
p->next = q;
p = q;
p2 = p2->next;
}
else
{
p->next = NULL;
break;
}
}
if(tmp > 0)
{
q = (struct ListNode*)malloc(sizeof(struct ListNode));
p->next = q;
p = q;
p->val = tmp;
p->next = NULL;
}
return head;
}
四、虚机运行截图
五、leecode提交代码
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
struct ListNode *p1 = l1;
struct ListNode *p2 = l2;
int x = 0;
int y = 0;
int tmp = 0;
struct ListNode *head,*p,*q;
head = (struct ListNode*)malloc(sizeof(struct ListNode));
p = head;
while((p1 != NULL) && (p2 != NULL))
{
x = ((p1->val) + (p2->val) + tmp) / 10;
y = ((p1->val) + (p2->val) + tmp) % 10;
p->val = y;
tmp = x;
if((p1->next != NULL) || (p2->next != NULL))
{
q = (struct ListNode*)malloc(sizeof(struct ListNode));
p->next = q;
p = q;
p1 = p1->next;
p2 = p2->next;
}
else if((p1->next == NULL) && (p2->next == NULL))
{
p->next = NULL;
p1 = p1->next;
p2 = p2->next;
}
}
while(p1 != NULL)
{
x = ((p1->val) + tmp) / 10;
y = ((p1->val) + tmp) % 10;
p->val = y;
tmp = x;
if(p1->next != NULL)
{
q = (struct ListNode*)malloc(sizeof(struct ListNode));
p->next = q;
p = q;
p1 = p1->next;
}
else
{
p->next = NULL;
break;
}
}
while(p2 != NULL)
{
x = ((p2->val) + tmp) / 10;
y = ((p2->val) + tmp) % 10;
p->val = y;
tmp = x;
if(p2->next != NULL)
{
q = (struct ListNode*)malloc(sizeof(struct ListNode));
p->next = q;
p = q;
p2 = p2->next;
}
else
{
p->next = NULL;
break;
}
}
if(tmp > 0)
{
q = (struct ListNode*)malloc(sizeof(struct ListNode));
p->next = q;
p = q;
p->val = tmp;
p->next = NULL;
}
return head;
}
六、leecode代码提交截图