2.两数相加

题目:

       给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

       如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

       您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

      输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
      输出:7 -> 0 -> 8
      原因:342 + 465 = 807

解题思路:

​       粗略一看这个题只要按位相加计算进位就可以,但是,如果两个数字的长度不一样,无法按照对应数位相加。可以在短的数字后面加0补齐到两个链表相等。然后按位相加进位就可以了

代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
	ListNode * addTwoNumbers(ListNode*l1, ListNode* l2) {
		int len1 = 0;
		int len2 = 0;
		ListNode* p = l1;
		ListNode* q = l2;
		//len1 和 len2 记录链表 l1 和 l2 的长度
		while (p->next != NULL) {
			len1 ++;
			p = p->next;
		}
		while (q->next != NULL) {
			len2 ++;
			q = q->next;
		}
		//长度短的链表后面加0
		if (len1 > len2) {
			for (int i = 1; i < len1 - len2; i++) {
				q->next = new ListNode(0);
				q = q->next;
			}
		}
		else {
			for (int i = 1; i < len2 - len1; i++) {
				p->next = new ListNode(0);
				p = p->next;
			}
		}
		p = l1;
		q = l2;
		//判断是否进位,进位
		bool count = false;  //进位标志位
		ListNode* l3 = new ListNode(-1);
		ListNode* w = l3;
		int i = 0;  
		while (p != NULL && q != NULL && len1 > 0 && len2 > 0) {
			i = p->val + q->val;
			w->next = new ListNode(i % 10);
			count = i >= 10 ? true : false;
			w = w->next;
			p = p->next;
			q = q->nextl
		}
		if (count) {
			w->next = new ListNode(1);
			w = w->next;
		}
		return l3->next;
	}
}

你可能感兴趣的:(leetcode刷题)