【问题标题】:How to remove the end value in a linked list in C#如何在C#中删除链表中的结束值
【发布时间】:2020-04-25 22:50:23
【问题描述】:

我需要创建一个程序,该程序将添加 2 个单独的链表中的 2 个数字。我使程序正常工作,但最后我得到了一个额外的 -1 值,这是我不需要的。我该如何摆脱它?这里有一些上下文:

/*
  Definition for singly-linked list.
  public class ListNode {
      public int val;
      public ListNode next;
      public ListNode(int x) { val = x; }
  }
 */
public class Solution {
    public ListNode AddTwoNumbers(ListNode l1, ListNode l2) {
        int a, k = 0;
        ListNode l3 = new ListNode(-1), curr = l3;
        do
        {
            if(k == 1)
                a = l1.val + l2.val + 1;
            else
                a = l1.val + l2.val;
            k = 0;
            if(a >= 10){
                curr.val = a - 10;
                k = 1;
            }
            else
                curr.val = a;
            l1 = l1.next; l2 = l2.next;
            curr.next = new ListNode(-1);
            curr = curr.next;
        }while(l1 != null && l2 != null);
        return l3;
    }
}

【问题讨论】:

  • 为了澄清:您将两个数字中的每个数字表示为链表节点中的一个值,链表以“ones”值开头?所以你一个接一个地遍历这两个数字,“carry the one”?

标签: c# list variables linked-list


【解决方案1】:

如果我正确理解了您的问题,我认为这是因为您在循环结束时创建了一个新节点。在这一行:

curr.next = new ListNode(-1);

通过在do...while 循环结束时创建一个新节点,列表中的最后一个节点将始终包含该-1。您想要的是在创建新节点之前评估是否满足终止条件。

改用下面的代码,我已将新节点的创建传递给后置条件:

public class Solution {
    public ListNode AddTwoNumbers(ListNode l1, ListNode l2) {
        ListNode l3 = new ListNode(-1), curr = l3;

        for(int a=0, k = 0; l1 != null && l2 != null ; curr.next = new ListNode(-1), curr = curr.next) 
        {
            if(k == 1)
                a = l1.val + l2.val + 1;
            else
                a = l1.val + l2.val;
            k = 0;
            if(a >= 10){
                curr.val = a - 10;
                k = 1;
            }
            else
                curr.val = a;

            l1 = l1.next; l2 = l2.next;
        }
        return l3;
    }
}

【讨论】:

    【解决方案2】:

    您还需要考虑其他极端情况,例如如果一个数字的位数多于另一个数字。 l1 = 7 -> 5 和 l2 = 8 -> 6 -> 5

    private static ListNode AddTwoNumbers(ListNode l1, ListNode l2)
        {
            if (l1 == null) return l2;
            if (l2 == null) return l1;
            ListNode l3 = new ListNode(-1), cur = l3;
            int a, k = 0;
            while (l1 != null || l2 != null)
            {
                if (k == 1)
                    a = (l1 == null ? 0 : l1.val) + (l2 == null ? 0 : l2.val) + 1;
                else
                    a = (l1 == null ? 0 : l1.val) + (l2 == null ? 0 : l2.val);
                k = 0;
                if (a >= 10)
                {
                    cur.val = a - 10;
                    k = 1;
                }
                else
                    cur.val = a;
                l1 = l1?.next;
                l2 = l2?.next;
                if (l1 == null && l2 == null)
                    break;
                cur.next = new ListNode(-1);
                cur = cur.next;
            }
            if (k == 1)
                cur.next = new ListNode(1);
            return l3;
        }
    

    【讨论】:

    • 非常感谢您的贡献,但该程序仍有一些缺陷。您的输入 [1] [9, 9] 输出 [0,10] 预期 [0,0,1]
    • 感谢您指出@VukMC。考虑提到的边缘情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 2020-09-05
    相关资源
    最近更新 更多