网站Logo MsBlog

【力扣】链表求和

pmsa
1182
2021-04-22

题目:

给定两个用链表表示的整数,每个节点包含一个数位。

这些数位是反向存放的,也就是个位排在链表首部。

编写函数对这两个整数求和,并用链表形式返回结果。

 

示例:

输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295
输出:2 -> 1 -> 9,即912
进阶:思考一下,假设这些数位是正向存放的,又该如何解决呢?

示例:

输入:(6 -> 1 -> 7) + (2 -> 9 -> 5),即617 + 295
输出:9 -> 1 -> 2,即912

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sum-lists-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:

因为头节点到尾节点依次是从个位、十位、百位。。。 所以我们只需要让两个链表直接挨个遍历相加,如个位相加的得数取模10,将得到的数存到新链表,这个数就是两个链表数相加后的个位数,以此类推个位,十位,,,皆是如此,最终得到的链表就是两个链表相加后的结果。
原理就像小学的加法算数,两数相加,逢十进一,余下的数当前进位即可;

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
	//排除一些极端情况
        if(l1 == null){
            return l2;
        }
        if(l2 == null){
            return l1;
        }
	//表示进位
        int carray = 0;
	ListNode head = new ListNode(0);
	ListNode pre = head;
	while(l1 != null || l2 != null || carray != 0) {
		//两链表求和的值,初始化,上一个相加的进位
		int sum = carray;
		if(l1 != null) {
			sum += l1.val;
			//l1节点向后移动
			l1 = l1.next;
		}
		if(l2 != null) {
			sum += l2.val;
			//l2节点向后移动
			l2 = l2.next;
		}
		//构建一个新节点,把将pre的指向新节点
		pre.next = new ListNode(sum%10);
		//pre的节点向后移动
		pre = pre.next;
		//两链表l1,l2数相加后的进位数
		carray = sum/10;
			
	}
	return head.next;
    }
}

动物装饰