给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
解题思路:
根据单项链表特性将两个链表循环提取出数据进行相加
这是对数字进位处理,解决方法有点粗暴;(有新的解法可以评论分享)
处理完后就是链表的创建了:
最后一步就是确定循环的结束标志:
最后的最后就是排除结束进位的情况:
这是最后整体的过程代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
int u = 0,m = 0,k = 0,l=0;
int p_flag = 0,q_flag = 0;
int flag = 1;
struct ListNode *p = l1,*q = l2,*head_new = NULL,*head_cpy = NULL;
while(flag)
{
k = (u + l)/10;
l = 0;
if (p_flag == 0 && q_flag == 0)
u = p->val + q->val;
else if(p_flag == 1 && q_flag == 0)
u = q->val;
else if(p_flag == 0 && q_flag == 1)
u = p->val;
m = (u + k)%10;
l = (u + k)/10;
k = 0;
struct ListNode *p_new = (struct ListNode *)malloc(sizeof(struct ListNode));
p_new->val = m;
if(head_new == NULL)
{
head_new = p_new;
head_cpy = p_new;
p_new->next = NULL;
}else
{
head_new->next = p_new;
p_new->next = NULL;
head_new = head_new->next;
}
if(p->next == NULL && q->next == NULL )
flag = 0;
if(p->next != NULL )
p = p->next;
else
p_flag = 1;
if(q->next != NULL)
q = q->next;
else
q_flag = 1;
}
if(l != 0 )
{
struct ListNode *p_new = (struct ListNode *)malloc(sizeof(struct ListNode));
p_new->val = l;
head_new->next = p_new;
p_new->next = NULL;
head_new = head_new->next;
}
return head_cpy;
}