一、题目:
描述
假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。
给定两个这种链表,请生成代表两个整数相加值的结果链表。
例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。
二、输入输出示例:
三、思路:
将两个链表反转,然后对齐,再逐项相加,注意进位问题。
四、代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
//反转链表的函数代码:设计三个指针进行链表反转
ListNode* reverse(ListNode* head){
if(head == NULL){
return head;
}
ListNode *p1,*p2,*p3;
p1 = NULL;
p2 = head;
p3 = head->next;
while(p3 != NULL){
p2->next = p1;
p1 = p2;
p2 = p3;
p3 = p3->next;
}
p2->next = p1;
return p2;
}
class Solution {
public:
/**
*
* @param head1 ListNode类
* @param head2 ListNode类
* @return ListNode类
*/
ListNode* addInList(ListNode* head1, ListNode* head2) {
// write code here
ListNode *result = new ListNode(0); //为result开辟一个空节点
ListNode *temp1 = result;
if(head1 == NULL){ //表1为空,则直接输出表2
return head2;
}
if(head2 == NULL){ //表2为空,则直接输出表1
return head1;
}
head1 = reverse(head1);
head2 = reverse(head2);
int res = 0; //定义1个res记录加和
while(head1 != NULL || head2 != NULL){ //表1表2至少有一个不空
if(head1 == NULL && head2 != NULL){ //表1空,表2不空,则加表2中的项
res += head2->val;
head2 = head2->next;
}
else if(head1 != NULL && head2 == NULL){ //表2空,表1不空,则加表1中的项
res += head1->val;
head1 = head1->next;
}
else{ //表1表2都不空,则加表1和表2的项
res += head1->val + head2->val;
head1 = head1->next;
head2 = head2->next;
}
if(res >= 10){ //加和>=10,需要进位,将res置1
temp1->val = res%10;
res = 1;
}
else{ //加和<10,不需进位,将res置0
temp1->val = res;
res = 0;
}
temp1->next = new ListNode(0); //给结点赋值后,在开辟新的空节点
temp1 = temp1->next; //结点后移一位
}
if(res == 1){ //如果最后一次加和需要进位,则将最后一个结点的值置1
temp1->val = 1;
}
ListNode *res1 = reverse(result); //反转结果链表
if(res1 -> val == 0) //如果最后不需要进1,则结果链表最后多了一个值为0的空节点,
//反转结果链表之后,这个0就放到了第一位,不可以输出
{
res1 = res1->next;
}
return res1;
}
};