【问题标题】:Question about LeetCode 2 and linked list关于 LeetCode 2 和链表的问题
【发布时间】:2021-11-06 21:31:23
【问题描述】:

我最近在学习链表,卡在了 LeetCode No.2。我知道链表可以有一个没有任何数据的头,而是对包含列表中数据的第一个节点的引用(链接)。在这种情况下,似乎 l1 和 l2 都没有这种头?还有,方法return head.next不是head,是不是说结果也是一个没有这种head的list呢?那么在什么情况下我们应该使用上面提到的带有头部的列表呢?

解决方法如下:

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        int carry = 0;
        ListNode head = new ListNode(0), p = head;
        while (l1 != null || l2 != null || carry != 0) {
            int sum = carry;
            if (l1 != null) { sum += l1.val; l1 = l1.next; } 
            if (l2 != null) { sum += l2.val; l2 = l2.next; }
            p.next = new ListNode(sum % 10);
            p = p.next;
            carry = sum / 10;
        }
        return head.next;
    }
}

【问题讨论】:

    标签: linked-list


    【解决方案1】:

    我知道链表可以有一个没有任何数据的头部,但可以引用(链接)到列表中包含数据的第一个节点。

    这实际上不是存储链表的正常方式。 “没有任何数据的头”可能会产生误导,因为不清楚该节点是否没有数据。如果你返回这样一个列表,Leet Code 不会将第一个节点与其他节点有任何不同:它的数据将被认为是相关的。

    好像l1和l2都没有这种头?

    没错。

    是不是表示结果也是一个没有这种头的列表?

    是的,这正是 Leet Code 所期望的。

    那么在什么情况下我们应该使用上面提到的带头的列表呢?

    使用它不是绝对要求,但它使代码更容易一些。它是一个临时的虚拟节点,最后不返回。

    以下是您不创建额外节点时代码的外观:

    class Solution {
        public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
            int carry = 0;
            ListNode head = null, p = null;
            while (l1 != null || l2 != null || carry != 0) {
                int sum = carry;
                if (l1 != null) { sum += l1.val; l1 = l1.next; } 
                if (l2 != null) { sum += l2.val; l2 = l2.next; }
                ListNode node = new ListNode(sum % 10);
                if (head == null) {
                    head = node;
                } else {
                    p.next = node;
                }
                p = node;
                carry = sum / 10;
            }
            return head;
        }
    }
    

    请注意,现在循环体必须检查它在哪种情况下:这是第一个节点吗?然后head 必须引用它。如果没有,前一个节点的next 属性必须引用它。遗憾的是,在每个 迭代中都会执行此检查,而实际上只需要第一次。使用虚拟节点就没有必要了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-12
      • 2021-12-02
      • 2022-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      相关资源
      最近更新 更多