Leetcode---两数相加--直观解法(链表)

两数相加

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例

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

  • 思路分析:本题比较直观,给出的链表权值低的在前,权值高的在后,很容易就想到遍历两个链表对应位相加即可
  • 需要注意的点在于,处理链表长度不同的情况,和产生进位的情况
  • 我们构造一个结果链表,每次对应位相加的值取余加到结果链表上即可
  • 这里的一个小技巧:构造结果链表时,构造一个空的头结点,目的在于方便我们处理循环,否则将构造链表放在循环中执行很费事,要考虑是不是个位的相加,个位的相加要构造新的链表,非个位的相加只需要将结果加到结尾,我们这样处理,只需要返回时返回result.next即可。

代码

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
	//判断是否有一个链表为空
   	if(l1==null) {
   		return l2;
   	}else if(l2==null) {
   		return l1;
   	}
   	
   	//从头开始遍历相加
   	ListNode result = new ListNode(0);
   	ListNode rear = result;
   	ListNode node = null;
   	int temp = 0;
   	while(l1!=null&&l2!=null) {
   		temp = temp>=10?l1.val+l2.val+1:l1.val+l2.val;
   		node = new ListNode(temp%10);
   		rear.next = node;
   		rear = rear.next;
   		l1 = l1.next;
   		l2 = l2.next;
   	}
   	//循环退出时可能含有进位
   	while(l1!=null) {
   		if(temp>=10) {
   			temp = l1.val+1;		//进位
   			node = new ListNode(temp%10);
   			rear.next = node;
   			rear = rear.next;
   			l1 = l1.next;
   		}else {
   			rear.next = l1;		//不进位
   			return result.next;
   		}
   		
   	}
   	while(l2!=null) {
   		if(temp>=10) {
   			temp = l2.val+1;		//进位
   			node = new ListNode(temp%10);
   			rear.next = node;
   			rear = rear.next;
   			l2 = l2.next;
   		}else {
   			rear.next = l2;		//不进位
   			return result.next;
   		}
   	}
   	if(temp>=10) {
   		node = new ListNode(1);
   		rear.next = node;
   	}
   	return result.next;
   }

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/tiaochewang219/article/details/84399301
今日推荐