保存基于节点的链接列表

时间:2017-02-07 13:06:38

标签: java algorithm linked-list

我希望保存基于节点的链接列表的起点,即。链接列表使用节点而不是Java类实现,因为我向列表添加了更多元素,并且必须继续前往下一个节点。

public class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        int c = 0;
        ListNode n = new ListNode(0);
        ListNode l3 = n; //Node initialised to first node.
        while (l1 != null || l2 != null || c != 0)
        {
            int sum = l1.val + l2.val + c;
            c = sum/10;
            sum = sum%10;

            n = new ListNode(sum);
            n = n.next;
            l1 = l1.next;
            l2 = l2.next;
        }

        return l3;
    }
}

在上面的示例中,我使用l3来执行此操作。但是当我返回l3时,它被设置为列表中的最后一个节点。 如何使用n阻止它在列表中移动。

-------- ---------- EDIT

以下是来自leetcode的问题,以便于参考:

  

您将获得两个非空链表,表示两个非负数   整数。数字以相反的顺序存储,每个数字都存储   节点包含一个数字。添加两个数字并将其作为a返回   链表。

     

您可以假设这两个数字不包含任何前导零,除了   数字0本身。

     

输入:(2 - > 4 - > 3)+(5 - > 6 - > 4)输出:7 - > 0 - > 8

2 个答案:

答案 0 :(得分:1)

看看那些

        n = new ListNode(sum);
        n = n.next;

这里,n,当前节点的地址,设置为完全不同的地址。旧地址处的节点现在与新创建的节点完全无关。换句话说,每次遍历循环时,都会丢弃旧列表并启动另一个列表。当然,由于旧节点不再被任何东西引用,垃圾收集器会杀死它们。只有第一个创建的节点仍然存在,因为l3仍然指向它。

您需要操纵当前节点(而不是替换它),然后将新节点链接到它,如下所示:

        n.val = sum
        if(l1.next != null || l2.next != null){
            n.next = new ListNode(0);
            n = n.next;
        }

顺便说一句,给你的变量一些专有名称。喜欢l1 - > list1,n - > currentNode,c - >携带。短暂并不好。可读性很好。

此外,当列表长度不同时,整个函数将崩溃,因为当其中一个列表为空时,您始终可以访问两者的值。你应该像

一样
        int sum = c;
        if(l1 != null){sum+=l1.val;}
        if(l2 != null){sum+=l2.val;}

在循环的开头和

        if(l1 != null){l1=l1.next;}
        if(l2 != null){l2=l2.next;}

最后。

答案 1 :(得分:1)

我有时间回去清理一下这个。希望它有所帮助。

class Solution {
  /**
   * add two numbers in linked list form, lowest digit first form
   * ie 1->0->3->4 represents the integer number 4301
   * given 7->8->9->1 and 5->6->7->9 this method will return 2->5->7->1->1 (1987+9765=11752)
   *
   * @param lhs the left hand integer
   * @param rhs the right hand integer
   * @return the sum of the two integers
   */
  public ListNode<Integer> addTwoNumbers(final ListNode<Integer> lhs,
                                         final ListNode<Integer> rhs) {
    return addTwoNumbers(lhs, rhs, 0);
  }

  private static ListNode<Integer> addTwoNumbers(final ListNode<Integer> lhs,
                                                 final ListNode<Integer> rhs,
                                                 final int carry) {
    int sum = carry;
    sum += lhs == null ? 0 : lhs.getValue();
    sum += rhs == null ? 0 : rhs.getValue();
    if (sum == 0 && rhs == null && lhs == null) {
      return null;
    } else {
      return new ListNode<>(
        addTwoNumbers(
          lhs == null ? null : lhs.getNext(),
          rhs == null ? null : rhs.getNext(),
          sum / 10),
        sum % 10);
    }
  }

  public static void main(final String... args) {
    final ListNode<Integer> lhs = ListNode.fromVarArgs(1, 9, 8, 7);
    final ListNode<Integer> rhs = ListNode.fromVarArgs(9, 7, 6, 5);
    System.out.print(lhs);
    System.out.println("+");
    System.out.println(rhs);
    System.out.println("=");
    System.out.println(new Solution().addTwoNumbers(lhs, rhs));
  }
}

class ListNode<T> {
  static <T> ListNode<T> fromVarArgs(T... digits) {
    ListNode<T> ret = null;
    for (final T digit : digits) {
      ret = new ListNode<>(ret, digit);
    }
    return ret;
  }

  private ListNode<T> next;
  final private T value;

  ListNode(final ListNode<T> next, final T value) {
    this.next = next;
    this.value = value;
  }

  ListNode(final T value) {
    this(null, value);
  }

  ListNode<T> getNext() {
    return next;
  }

  void setNext(final ListNode<T> next) {
    this.next = next;
  }

  T getValue() {
    return value;
  }

  @Override
  public String toString() {
    if (getNext() == null) {
      return getValue().toString();
    } else {
      return String.format(
        "%s -> %s",
        getValue().toString(),
        getNext().toString());
    }
  }
}