Узел LinkList пропускает l oop и переходит к следующему параметру - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь попрактиковаться в примере с leetcode. Вход - [2,4,3] [5,6,4]

Ожидаемый результат = = [7,0,8]; (2 + 5, 4 + 6, 3 + 4 + 1 (перенос 1 из узла 2)); Я получаю [7,8];

q.next и p.next - пропускает добавление 2-го узла и делает добавление только для 1-го и 3-го узла. Я не могу понять, почему пропущен второй узел.

public class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { val = x; }
}

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode extra = new ListNode(0);
        ListNode p = l1 , q = l2, curr = extra;
        int carry = 0;
        while(p != null || q != null)
        {
            int x = (p != null) ? p.val :0 ;
            int y = (q != null) ? q.val :0 ;
            int sum = carry + x + y ;
            carry = sum / 10;
            curr.next = new ListNode(sum % 10);
            p=p.next;
            q=q.next;
            if(p != null)p = p.next;
            if(q != null)q = q.next;
        }
        if(carry > 0)
        {
            curr.next = new ListNode(carry);
        }
        return curr;
    }
}

РЕДАКТИРУЕТСЯ В ОТВЕТАХ - я проверил приведенный ниже код в leetcode. Он по-прежнему говорит, что результат равен [0,8] вместо [7,0,8]

, вот ссылка на проблему: https://leetcode.com/problems/add-two-numbers/

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
          ListNode extra = new ListNode(0);
        ListNode p = l1 , q = l2, curr = extra;
        int carry = 0;
        while(p != null || q != null)
        {
            int x = (p != null) ? p.val :0 ;
            int y = (q != null) ? q.val :0 ;
            int sum = carry + x + y ;
            carry = sum / 10;
            curr.next = new ListNode(sum % 10);

            if(p != null)p = p.next;
            if(q != null)q = q.next;
        }
        if(carry > 0)
        {
            curr.next = new ListNode(carry);
        }
        return curr;
    }
}

Ответы [ 3 ]

3 голосов
/ 25 февраля 2020

Вы увеличиваете оба указателя ListNode больше, чем должны. В этой части:

    while(p != null || q != null)
    {
        int x = (p != null) ? p.val :0 ;
        int y = (q != null) ? q.val :0 ;
        int sum = carry + x + y ;
        carry = sum / 10;
        curr.next = new ListNode(sum % 10);
        p=p.next; /* You increment the pointers right after this */
        q=q.next;
        if(p != null)p = p.next; // You don't even need this if statement either, thats what the while loop checks.
        if(q != null)q = q.next;
    }

Кроме того, вы должны поставить while(p != null && q != null) вместо ||, а затем поставить любое оставшееся значение после того, как вы выйдете за пределы l oop.

Если Вы хотите, вы можете посмотреть на мое решение: https://leetcode.com/problems/add-two-numbers/discuss/519946/Java-Simple

3 голосов
/ 25 февраля 2020

У вас есть избыточный

p = p.next 
q = q.next

, что приводит к пропуску нечетных индексов (на основе 0). Это должно быть удалено, так как только

if(p != null)p = p.next;
if(q != null)q = q.next;

будет достаточно

2 голосов
/ 25 февраля 2020
  1. Как уже упоминалось в других ответах, p и q продвигаются дважды в каждой итерации (с риском NullPointerException BTW).
  2. Также curr является никогда не продвигается, поэтому extra.next перезаписывается на каждой итерации.
  3. Ваш метод возвращает curr, который указывает на последний элемент списка в конце метода. Попробуйте вместо этого вернуть extra.next (или extra, если это null и вам нужен хотя бы один элемент).

    ListNode extra = new ListNode(0);
    ListNode p = l1 , q = l2, curr = extra;
    int carry = 0;
    while(p != null || q != null)
    {
        int x = (p != null) ? p.val :0 ;
        int y = (q != null) ? q.val :0 ;
        int sum = carry + x + y ;
        carry = sum / 10;
        curr.next = new ListNode(sum % 10);
        curr = curr.next;
        if(p != null)p = p.next;
        if(q != null)q = q.next;
    }
    if(carry > 0)
    {
        curr.next = new ListNode(carry);
    }
    return extra.next == null ? extra : extra.next;
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...