描述:
你有两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中相反
的顺序,使得第一个数字位于链表的开头。写出一个函数将两个整数相加,用链表形式返回和。
样例:
给出两个链表 3->1->5->null
和 5->9->2->null
,返回 8->0->8->null
分析:
题目很简单,主要是对链表的操作。
由样例可知每个节点的值为一位数。建立两根指针ptr1和ptr2分别遍历链表l1和l2,变量jinWei保存进位值,指针newHead为需返回的链表的头节点,指针curr为返回链表的尾节点。
当ptr1和ptr2均不为null时,新节点的值为指针ptr1和ptr2指向节点的值相加并对10取模,jinWei的值为两节点之和除10的商。
当ptr1或则ptr2为NULL时,指针不为空表示链表未遍历完,只需将其连接到结果链表末尾就行(注意要考虑jinWei)。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
/**
* @param l1: the first list
* @param l2: the second list
* @return: the sum list of l1 and l2
*/
ListNode *addLists(ListNode *l1, ListNode *l2) {
// write your code here
if(l1 == NULL && l2 == NULL) //两个链表均为NULL,返回NULL
return NULL;
if(l1 == NULL && l2 != NULL) //链表l1为NULL,返回l2
return l2;
if(l1 != NULL && l2 == NULL) //链表l2为NULL,返回l1
return l1;
ListNode *ptr1 = l1;
ListNode *ptr2 = l2;
// newHead为返回链表的头节点
ListNode *newHead = new ListNode((ptr1->val + ptr2->val) % 10);
int jinWei = (ptr1->val + ptr2->val) / 10;
// curr为返回链表的尾节点
ListNode *curr = newHead;
ptr1 = ptr1->next;
ptr2 = ptr2->next;
// ptr1和ptr2均不为NULL时的情况
while(ptr1 != NULL && ptr2 != NULL){
curr->next = new ListNode((ptr1->val + ptr2->val + jinWei) % 10);
jinWei = (ptr1->val + ptr2->val + jinWei) / 10;
ptr1 = ptr1->next;
ptr2 = ptr2->next;
curr = curr->next;
}
// ptr1为NULL或ptr2为NULL时的情况
if(ptr1 != NULL){
while(ptr1 != NULL){
curr->next = new ListNode((ptr1->val + jinWei) % 10);
jinWei = (ptr1->val+ jinWei) / 10;
ptr1 = ptr1->next;
curr = curr->next;
}
}
if(ptr2 != NULL){
while(ptr2 != NULL){
curr->next = new ListNode((ptr2->val + jinWei) % 10);
jinWei = (ptr2->val+ jinWei) / 10;
ptr2 = ptr2->next;
curr = curr->next;
}
}
// 最后需考虑jinWei的值是否不为0
if(jinWei != 0)
curr->next = new ListNode(jinWei);
return newHead;
}
};