445. Add Two Numbers II | 链表的整数相加

本文介绍了一种解决链表加法问题的方法,通过计算两个非空链表表示的非负整数之和,并返回结果作为新的链表。文章详细阐述了算法步骤,包括处理不同长度的链表、进位等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • Total Accepted: 15900
  • Total Submissions: 34368
  • Difficulty: Medium
  • Contributors: Admin

You are given two non-empty linked lists representing two non-negative integers. The most significant digit comes first and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

You may assume the two numbers do not contain any leading zero, except the number 0 itself.

Follow up:
What if you cannot modify the input lists? In other words, reversing the lists is not allowed.

Example:

Input: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 8 -> 0 -> 7

Subscribe to see which companies asked this question.


思路:先计算两个链表的长度,将长度大的链表的多余部分头插法,插入到新的链表中去,再同时编辑两个链表,将和设为新节点的值同样头插法插入到新的链表中去,再逆置新的链表,同时修改新链表节点的值,将大于10的取余作为进位,最后返回头结点即可。

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
		ListNode res = new ListNode(-1);
		res.next = null;
		ListNode p1 = l1, p2 = l2;
		int len1 = 0, len2 = 0;
		while (p1 != null) {
			len1++;
			p1 = p1.next;
		}
		while (p2 != null) {
			len2++;
			p2 = p2.next;
		}
		ListNode longNode = p1 = len1 > len2 ? l1 : l2;
		p2 = (len1 <= len2) ? l1 : l2;
		int dif = Math.abs(len1 - len2);
		while (dif > 0) {
			ListNode node = new ListNode(p1.val);
			node.next = res.next;
			res.next = node;
			p1 = p1.next;
			dif--;
		}
		len1 = len1 < len2 ? len1 : len2;
		while (p1 != null && p2 != null) {
			ListNode node = new ListNode(p1.val + p2.val);
			node.next = res.next;
			res.next = node;
			p1 = p1.next;
			p2 = p2.next;
		}

		int jinwei = 0, val;
		ListNode p = res.next, t;
		res.next = null;
		while (p != null) {
			t = p.next;
			val = (p.val + jinwei) % 10;
			jinwei = (p.val + jinwei) / 10;
			p.val = val;
			p.next = res.next;
			res.next = p;
			p = t;
		}
		res.val = jinwei;
		return jinwei > 0 ? res : res.next;
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值