2,Add Two Number (LinkList Math)

/*
You are given two linked lists representing two non-negative numbers.
The digits are stored in reverse order and each of their nodes contain a single digit.
Add the two numbers and return it as a linked list.

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
*/


#include<stdlib.h>
#include<stdio.h>

struct ListNode {
           int val;
           struct ListNode *next;
};

void printList(ListNode *& header){
           if (header == NULL){
                    return;
          }

           ListNode* node = header ;
           while (node != NULL ){
                   printf( "%d   ", node->val);
                   node = node->next;
          }
          printf( "\n");
}

void createList(ListNode *& header, int * array , int len){
           header = (ListNode *)malloc(sizeof( ListNode));
           ListNode* tailer = header ;

           ListNode* tempNode = NULL ;
           ListNode* pre = header ;
           for (int i = 0; i < len; i++){
                   tailer->val = *( array+i);
                   pre = tailer;
                   tempNode = ( ListNode*)malloc(sizeof (ListNode));
                   tailer->next = tempNode;
                   tailer = tempNode;
          }

          pre ->next= NULL;
}


 ListNode* addTwoNumbers( ListNode* l1 ,  ListNode* l2) {

           if (l1 == NULL){
                    return l2 ;
          }

           if (l2 == NULL){
                    return l1 ;
          }

           ListNode* header = (ListNode *)malloc(sizeof( ListNode));
           ListNode* tailer = header;

           ListNode* tempNode = NULL ;
           ListNode* pre = header;

           int isIncress = 0;
           while (l1 != NULL && l2 != NULL ){

                    int value = l1 ->val + l2->val;

                    if (isIncress){
                             value += 1;
                             isIncress = 0;
                   }
                    if (value >= 10)      {
                             value = value % 10;
                             isIncress = 1;
                   }

                   tailer->val = value;
                   pre = tailer;
                   tempNode = ( ListNode*)malloc(sizeof (ListNode));
                   tailer->next = tempNode;
                   tailer = tempNode;

                    l1 = l1 ->next;
                    l2 = l2 ->next;
          }

           if (l1 == NULL && l2 == NULL && isIncress){
                   tailer->val = 1;
                   pre = tailer;
                   tempNode = ( ListNode*)malloc(sizeof (ListNode));
                   tailer->next = tempNode;
                   tailer = tempNode;

                   isIncress = 0;
          }

           while (l1 != NULL){
                    int value = l1 ->val;

                    if (isIncress){
                             value += 1;
                             isIncress = 0;
                   }
                    if (value >= 10)      {
                             value = value % 10;
                             isIncress = 1;
                   }

                   tailer->val = value;
                   pre = tailer;
                   tempNode = ( ListNode*)malloc(sizeof (ListNode));
                   tailer->next = tempNode;
                   tailer = tempNode;

                    l1 = l1 ->next;
          }

           while (l2 != NULL){
                    int value = l2 ->val;

                    if (isIncress){
                             value += 1;
                             isIncress = 0;
                   }
                    if (value >= 10)      {
                             value = value % 10;
                             isIncress = 1;
                   }

                   tailer->val = value;
                   pre = tailer;
                   tempNode = ( ListNode*)malloc(sizeof (ListNode));
                   tailer->next = tempNode;
                   tailer = tempNode;

                    l2 = l2 ->next;
          }

           if (isIncress){
                   tailer->val = 1;
                   pre = tailer;
                   tempNode = ( ListNode*)malloc(sizeof (ListNode));
                   tailer->next = tempNode;
                   tailer = tempNode;
          }

          pre ->next= NULL;

           return header;
}


int main(){

           int array1[1] = { 1 };

           int array2[2] = {  9,9 };

           ListNode * h1 = NULL ;
           ListNode * h2 = NULL ;


          createList(h1, array1, 1);
          createList(h2, array2, 2);

          printList(h1);
          printList(h2);
           ListNode* result = addTwoNumbers(h1, h2);
          printList(result);

          printf( "Hello world \n");
           return 0;
}
<think>好的,我现在需要回答用户关于Java中LinkedList的add方法的问题。首先,我得回忆一下LinkedList的基本知识。LinkedList在Java中是一个双向链表实现的List,它允许高效的插入和删除操作,特别是在列表的头部和尾部。而add方法有几个重载版本,需要分别说明。 用户提到了add方法,可能想知道不同参数情况下的用法。根据提供的引用资料,比如引用[1]提到add(int index, E element),引用[3]讨论了boolean add(Object element)方法。所以,我需要分清楚不同add方法的使用场景和示例。 首先,我应该列出LinkedList中常见的add方法,比如无参的add(E e),它是在链表末尾添加元素。然后是有两个参数的add(int index, E element),在指定位置插入元素。另外可能还有addFirst和addLast方法,不过这些属于Deque接口的方法,但LinkedList也实现了这些。 接下来,需要结合示例代码来说明每个方法的用法。例如,引用[3]中的代码示例可能有用,可以展示如何创建一个LinkedList并调用add方法添加元素。还要注意异常处理,比如当index超出范围时,会抛出IndexOutOfBoundsException,这一点需要提醒用户。 此外,用户提供的引用中提到了LinkedList与ArrayList的区别,可能在回答中适当提及,但主要专注于add方法本身。需要确保每个示例代码语法正确,并且符合Java的标准写法。 可能还需要解释为什么LinkedList的add操作在某些位置更高效,比如在中间插入元素不需要像ArrayList那样移动大量元素,而是通过改变指针实现。但用户的问题主要是用法,所以这部分可以作为补充说明,不是重点。 最后,生成相关问题的时候,应该考虑用户可能进一步想知道的内容,比如性能比较、其他常用方法或者使用场景。例如,引用[2]提到LinkedList的使用场景不多,但有些时候有用,可以引导用户了解何时选择LinkedList。 要确保回答结构清晰,分点说明每个add方法,给出代码示例,并添加注意事项。同时,引用资料要正确对应,比如引用[1]对应add(int index, E element)的例子,引用[3]对应boolean add(Object element)的示例。 现在需要检查是否有遗漏的方法,比如addAll或者其他变体,但根据用户的问题,可能只需覆盖主要的add方法。最后,语言要使用中文,避免术语错误,并保持自然流畅。</think>### Java LinkedList add() 方法使用说明 Java 的 `LinkedList` 类提供了多种 `add()` 方法用于添加元素,支持在链表末尾、指定位置或作为集合批量添加元素。以下是具体用法及示例: --- #### **1. `boolean add(E e)`** - **功能**:将元素追加到链表末尾。 - **返回值**:始终返回 `true`(因继承自 `AbstractCollection`,此处返回值仅用于兼容性)。 - **示例**: ```java LinkedList<String> list = new LinkedList<>(); list.add("A"); list.add("B"); // 结果:["A", "B"] ``` --- #### **2. `void add(int index, E element)`** - **功能**:在指定索引位置插入元素。索引范围为 $0 \leq \text{index} \leq \text{size}$,超出范围会抛出 `IndexOutOfBoundsException`[^1]。 - **示例**: ```java LinkedList<Integer> nums = new LinkedList<>(); nums.add(0, 10); // 在索引0插入10 → [10] nums.add(1, 20); // 在索引1插入20 → [10, 20] nums.add(1, 15); // 在索引1插入15 → [10, 15, 20] ``` --- #### **3. `boolean addAll(Collection<? extends E> c)`** - **功能**:将集合所有元素追加到链表末尾。 - **返回值**:若链表因操作而改变则返回 `true`。 - **示例**: ```java LinkedList<String> list1 = new LinkedList<>(Arrays.asList("A", "B")); List<String> list2 = Arrays.asList("C", "D"); list1.addAll(list2); // 结果:["A", "B", "C", "D"] ``` --- #### **4. `boolean addAll(int index, Collection<? extends E> c)`** - **功能**:从指定索引位置插入集合所有元素。 - **示例**: ```java LinkedList<Integer> nums = new LinkedList<>(Arrays.asList(10, 40)); List<Integer> subList = Arrays.asList(20, 30); nums.addAll(1, subList); // 结果:[10, 20, 30, 40] ``` --- #### **注意事项** 1. **时间复杂度**: - 在链表末尾或头部添加元素:$O(1)$。 - 在指定位置插入元素:平均 $O(n)$(需遍历至目标位置)[^2]。 2. **适用场景**:频繁在中间插入/删除元素时,`LinkedList` 效率通常高于 `ArrayList`。 --- ### **代码示例** ```java import java.util.LinkedList; public class LinkedListExample { public static void main(String[] args) { LinkedList<String> fruits = new LinkedList<>(); fruits.add("Apple"); // 末尾添加 → [Apple] fruits.add(0, "Banana"); // 头部插入 → [Banana, Apple] fruits.add(1, "Mango"); // 索引1插入 → [Banana, Mango, Apple] System.out.println(fruits); // 输出:[Banana, Mango, Apple] } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值