LeetCode上的两数相加问题
思路:取出链表末尾值,然后进行进位加法
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
int sum,ten,ge;
char trg = 0;
struct ListNode *L, *p, *n, *q, *r;//指针
L = (struct ListNode *)malloc(sizeof(struct ListNode));//头结点,尾插法
r = L;
p = l1;
q = l2;
while(p || q)
{
if(p && q)//链表等长部分
{
if(trg){
sum = p->val + q->val + 1;
trg = 0;
}
else{
sum = p->val + q->val;
}
ten = sum / 10;
ge = sum % 10;
n = (struct ListNode *)malloc(sizeof(struct ListNode));
n->val = ge;
r->next = n;
r = r->next;
if(ten){
trg = 1;
}
else{
}
q = q->next;
p = p->next;
}
else if(q){//q长的部分
n = (struct ListNode *)malloc(sizeof(struct ListNode));
if(trg){
sum = q->val + 1;
trg = 0;
}
else{
sum = q->val;
}
ten = sum / 10;
ge = sum % 10;
n->val = ge;
r->next = n;
r = r->next;
if(ten){
trg = 1;
}
q = q->next;
}
else {//p长的部分
n = (struct ListNode *)malloc(sizeof(struct ListNode));
if(trg){
sum = p->val + 1;
trg = 0;
}
else{
sum = p->val;
}
ten = sum / 10;
ge = sum % 10;
n->val = ge;
r->next = n;
r = r->next;
if(ten){
trg = 1;
}
p = p->next;
}
}
if(trg){//防止等长最高位有进位
n = (struct ListNode *)malloc(sizeof(struct ListNode));
n->val = 1;
r->next = n;
r = r->next;
trg = 0;
}
r -> next = NULL;
return L->next;
}
感觉像是链表的应用题,不是很难,但是我的代码比较笨,效率不高。
稍微修改一下trg作用,让他既可以保存进位的1然后又可以作为标志位。
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
int sum,trg = 0;
struct ListNode *L, *p, *n, *q, *r;
L = (struct ListNode *)malloc(sizeof(struct ListNode));
r = L;
p = l1;
q = l2;
while(p || q)
{
if(p && q)
{
if(trg){
sum = p->val + q->val + trg;
trg = 0;
}
else{
sum = p->val + q->val;
}
trg = sum / 10;
n = (struct ListNode *)malloc(sizeof(struct ListNode));
n->val = sum % 10;
r->next = n;
r = r->next;
q = q->next;
p = p->next;
}
else if(q){
n = (struct ListNode *)malloc(sizeof(struct ListNode));
if(trg){
sum = q->val + trg;
trg = 0;
}
else{
sum = q->val;
}
trg = sum / 10;
n->val = sum % 10;
r->next = n;
r = r->next;
q = q->next;
}
else {
n = (struct ListNode *)malloc(sizeof(struct ListNode));
if(trg){
sum = p->val + trg;
trg = 0;
}
else{
sum = p->val;
}
trg = sum / 10;
n->val = sum % 10;
r->next = n;
r = r->next;
p = p->next;
}
}
if(trg){
n = (struct ListNode *)malloc(sizeof(struct ListNode));
n->val = trg;
r->next = n;
r = r->next;
trg = 0;
}
r -> next = NULL;
return L->next;
}