You are given two non-empty linked lists representing two non-negative integers. 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.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
题意大致是说将两组用链表保存的数据单独相加,低一位上的和大于10,则进位到高一位上,并将数据用链表保存,比如:123和987两组数是用链表保存的:1 -> 2 -> 3,9 -> 8-> 7,1 + 9 = 10,则该位为0,向下一位中进1,下一位中2 + 8 = 10,加1后得到11,向下一位中进1,该位为1,下一位中3 + 7 = 10,加1得到11,该位为1,多一个1需要再加一个链表来保存它,结果:0 -> 1 -> 1 -> 1- > 1。
下面是解决方案(C语言):
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode * addTwoNumbers(struct ListNode * l1, struct ListNode * l2) { struct ListNode * sum; struct ListNode * t; struct ListNode * s, * AddNode; int num1, num2; int flag = 0; if (l1 == NULL) return l2; if (l2 == NULL) return l1; sum = (struct ListNode *)malloc(sizeof(struct ListNode)); s = sum; while(l1 || l2) { t = (struct ListNode *)malloc(sizeof(struct ListNode)); num1 = l1 == NULL? 0 : l1 -> val; num2 = l2 == NULL? 0 : l2 -> val; t -> val = num1 + num2 + flag; flag = (t -> val > 9) ? 1 : 0; if(flag) t -> val %= 10; if(l1 != NULL) l1 = l1 -> next; if(l2 != NULL) l2 = l2 -> next; s -> next = t; s = t; t -> next = NULL; //一开始提交很多次都不过,错误竟然是没有写这个 } if(flag) { AddNode = (struct ListNode *)malloc(sizeof(struct ListNode)); AddNode -> val = flag; AddNode -> next = NULL; t -> next = AddNode; } return sum -> next; }
Submission Result: Accepted.