力扣-2题(Java)
发布日期:2021-05-10 02:26:42 浏览次数:22 分类:精选文章

本文共 3118 字,大约阅读时间需要 10 分钟。

好的,我来帮助您优化这段内容。以下是优化后的版本:


题目链接:图片加载失败时请查看实际链接。题目如下:

[Kattis - Add Two Numbers as Linked Lists](https://kattis.com/solutions/qqqiy проческиЦУУУУ)

给定两个只含有数字的单链表,我们需要将它们相加,得到一个新的单链表。每个节点只包含一个数字值,下一个指针。请注意,这两个链表可能不在同一个位置开始,因此需要对齐他们的末尾。

解一:

:=getVar рубить.

public class Solution {    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {        ListNode head = new ListNode(0);        ListNode cur = head;        int sum = 0, carry = 0;                while (l1 != null && l2 != null) {            int sumNodes = carry ? l1.val + l2.val + 1 : l1.val + l2.val;            carry = sumNodes >= 10 ? 1 : 0;            sumNodes %= 10;                        ListNode nextNode = new ListNode(sumNodes);            cur.next = nextNode;            cur = nextNode;                        l1 = l1.next;            l2 = l2.next;        }                while (l1 != null) {            int sumNode = carry ? l1.val + 1 : l1.val;            carry = sumNode >= 10 ? 1 : 0;            sumNode %= 10;                        ListNode nextNode = new ListNode(sumNode);            cur.next = nextNode;            cur = nextNode;                        l1 = l1.next;        }                while (l2 != null) {            int sumNode = carry ? l2.val + 1 : l2.val;            carry = sumNode >= 10 ? 1 : 0;            sumNode %= 10;                        ListNode nextNode = new ListNode(sumNode);            cur.next = nextNode;            cur = nextNode;                        l2 = l2.next;        }                if (carry == 1) {            cur.next = new ListNode(1);            cur = cur.next;        }                return head.next;    }}

解二:

这是一个更加简洁的解法,同学们可以通过不断对齐两个链表的末尾节点,逐位相加处理每一位数字,并根据情况处理进位。

public class Solution {    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {        ListNode head = new ListNode(0);        ListNode cur = head;        int carry = 0;                while (l1 != null && l2 != null) {            int sum = l1.val + l2.val + carry;            carry = sum >= 10 ? 1 : 0;            sum %= 10;                        cur.next = new ListNode(sum);            cur = cur.next;                        l1 = l1.next;            l2 = l2.next;        }                while (l1 != null) {            sum = l1.val + carry;            carry = sum >= 10 ? 1 : 0;            sum %= 10;                        cur.next = new ListNode(sum);            cur = cur.next;                        l1 = l1.next;        }                while (l2 != null) {            sum = l2.val + carry;            carry = sum >= 10 ? 1 : 0;            sum %= 10;                        cur.next = new ListNode(sum);            cur = cur.next;                        l2 = l2.next;        }                if (carry == 1) {            cur.next = new ListNode(1);            cur = cur.next;        }                return head.next;    }}

哪种解法更好?

解一的思路更注重逐条处理,分别对齐两个链表的末端节点,按照顺序进行相加和进位处理。解二则通过合并两个链表的操作,只需在处理每一位数字时同时处理两个节点及进位。在实际开发中,解二的代码更短,更易于维护。但如果对齐的两个链表的长度不同,可以考虑解一的方案,以确保不会出现超出链表长度的错误。

技术要点:

  • 链表对齐:由于两个链表可能长度不一,需要先从末端开始对齐,逐位进行加法。
  • 进位处理:每次相加时检查是否需要进位,并将进位传递到下一个步骤。
  • 尾节点处理:处理完一个链表后,继续处理剩余的链表节点(可能存在一个链表还有剩余节点的情况)。

希望您能够从中得到帮助!

上一篇:力扣-153题(Java)
下一篇:力扣-81题(Java)

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2025年04月17日 06时14分02秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章