LeetCode刷题第二题

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字

1.思路:创建链表类,再将数字连成链表。将两串链表传入处理方法中。
难点:处理链表的方法
2.处理思路:补零法,因为链表是从末尾开始取数的,所以当两个链表长度不同时,在高位补零即可。进制处理:定义一个变量carry,将进制数存储在里面。
3.代码: 内联代码片

class ListNode{
	int val;
	ListNode next;
	
	public ListNode() {
		super();
	}
	public ListNode(int val) {
		super();
		this.val = val;
	}
	public ListNode(int val, ListNode next) {
		super();
		this.val = val;
		this.next = next;
	}
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return  " "+val + next ;
	}
	
}
class Solution{
	public  ListNode addTwoNumbers(ListNode l1, ListNode l2) {
		//创建新链表的虚拟头节点
		ListNode newHead = new ListNode(0);
		ListNode cur = newHead;
		int carry = 0;//保存进值
		int sum = 0;//保存结果
		while(l1 != null || l2 != null) {
			int x = l1 == null ? 0: l1.val;
			int y = l2 == null ? 0: l2.val;
			
			sum = x + y + carry;
			carry = sum / 10;
			sum = sum % 10;
			cur.next = new ListNode(sum);
			cur = cur.next;//cur后移
			if(l1 != null) {
				l1 = l1.next;
			}
			if(l2 != null) {
				l2 = l2.next;
			}
			
		}
		//退出while循环时,判断carry的值
		if(carry == 1) {
			cur.next = new ListNode(carry);//
		}
		return newHead.next;

	}
}

4.代码手动演示
在这里插入图片描述
5.学习心得:看官方答案时没看懂,是在评论里找到的一篇大神写的,本博客仅用于学习记录,如侵犯版权,请及时联系。运行速度很快,击败了百分之99的答案,但内存消耗较大,有时间再去学习空间复杂度低的方法。

猜你喜欢

转载自blog.csdn.net/balder_girl/article/details/113335931