2017-02-07 5 views
2

Я хочу сохранить начальную точку связанного списка на основе узла, т.е. Связанный список реализован с использованием Nodes вместо класса 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 для облегчения ведения:

Вы приведены два не -пустые связанные списки, представляющие два неотрицательных целых числа . Цифры хранятся в обратном порядке, и каждый из их узлов содержит одну цифру. Добавьте два числа и верните их как связанный список .

Вы можете предположить, что два числа не содержат никакого начального нуля, кроме самого числа 0.

Входной сигнал: (2 -> 4 -> 3) + (5 -> 6 -> 4) Выход: 7 -> 0 -> 8

+2

Что вы собираетесь делать с этим кодом? – mc20

+0

Это проблема практики из Leetcode. –

+0

, пожалуйста, отправьте ссылку на проблему с leetcode здесь – mc20

ответ

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; 
     } 

Btw, дают переменные некоторые собственные имена. Как l1 -> list1, n -> currentNode, c -> carry. Короткие нехорошо. Чтение - это хорошо.

Кроме того, вся функция будет сбой, если списки не имеют одинаковой длины, так как вы всегда получаете доступ к значениям обоих, когда один из них может быть нулевым. Вы должны идти, как

 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

У меня было время вернуться и немного почистить. Надеюсь, поможет.

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()); 
    } 
    } 
} 
Смежные вопросы