Node *Add(Node*L1,Node*L2) { Node *a,*b,*p; a=L1->next; b=L2->next; p=L1; while(a!=NULL&b!=NULL) { if(a->expn==b->expn) { a->coef=a->coef+b->coef; p->next=a; p=p->next; a=a->next; b=b->next; } else if(a->expn<b->expn) { p->next=b; p=p->next; b=b->next; } else { p->next=a; p=p->next; a=a->next; } } if(a!=NULL)//比较之后还有一个没有空就执行下面 { p->next=a; } if(b!=NULL) { p->next=b; } return L1; }分析这段代码
时间: 2024-03-31 22:35:48 浏览: 17
这段代码实现了两个多项式的相加,返回一个新的多项式。接受两个参数L1和L2,分别为两个待相加的多项式,类型为链表。代码中的a、b、p均为链表节点指针。
代码中的while循环用于遍历两个多项式的每一项,将相同指数的项的系数相加,并用a链表中的节点存储结果,p指向a的末尾。如果a的指数小于b的指数,则将b链表中的节点插入a链表中,反之则将a链表中的节点插入。最后,如果a链表和b链表中还有剩余的节点,则将它们全部插入a链表的末尾。
最后返回L1链表,即为相加后的结果链表。
相关问题
2. 给定两个非空链表代表两个非负数。这两个非负数是在链表中是按照倒序的方式存储的,每个节点存储了一位数。返回一个链表代表两个非负数相加的和。除了0之外,非负数开头不能是0。 Example Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8 Explanation: 342 + 465 = 807. /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { } };
这是一道链表的经典题目,我们可以利用链表的特性从低位到高位进行相加,并且需要注意进位的情况。具体实现可以按照以下步骤:
1. 定义一个进位标记carry,初始值为0,表示没有进位。
2. 定义一个头结点dummy,用于最后返回结果。
3. 定义一个指针cur,初始指向dummy。
4. 循环遍历l1和l2,直到两个链表均为空。
- 在循环中,定义两个变量x和y分别表示l1和l2当前节点的值。
- 计算当前位的和sum = x + y + carry,更新进位carry = sum / 10。
- 创建一个新节点node,其值为sum % 10,将此节点插入到cur之后。
- 将cur指向新插入的节点node。
- l1和l2均非空时,分别将l1和l2指向下一个节点,否则将其指向空节点。
5. 最后检查是否还有进位,若有,则创建一个值为carry的新节点插入到cur之后。
6. 返回dummy的下一个节点即为结果。
以下是具体的实现代码:
```cpp
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* dummy = new ListNode(0); // 头结点
ListNode* cur = dummy; // 当前指针
int carry = 0; // 进位标记
while (l1 != nullptr || l2 != nullptr) {
int x = l1 != nullptr ? l1->val : 0;
int y = l2 != nullptr ? l2->val : 0;
int sum = x + y + carry;
carry = sum / 10;
cur->next = new ListNode(sum % 10);
cur = cur->next;
if (l1 != nullptr) l1 = l1->next;
if (l2 != nullptr) l2 = l2->next;
}
if (carry > 0) {
cur->next = new ListNode(carry);
}
return dummy->next;
}
};
```
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode head =null, tail =null; int carry =0; while(l1 != null && l2 != null){ //取出元素 //计算总和 //创建新节点 //把新节点链接在tail后 //更新tail //更新 l1 l2 int num1 = l1!=null?l1.val:0; int num2 = l2!=null?l2.val:0; int sum = num1+num2+carry; if(head == null){ head = tail =new ListNode(sum%10); }else{ tail.next =new ListNode(sum%10); } tail = tail.next; if(l1 != null) l1 = l1.next; if(l2 != null) l2 = l2.next; carry = sum/10; } if (carry>0){ tail.next = new ListNode(carry); } return head;}}请问这段代码问什么报错NULL POINT EXCEPTION
这段代码可能会出现空指针异常的原因是在最后判断进位是否大于0时,如果carry大于0,应该新建一个节点并将其链接在tail后,然后返回head。但是在代码中,当carry大于0时,只是将tail.next赋值为新建的节点,但是tail.next.next是为空的,因此在访问tail.next.next时会出现空指针异常。
为了解决这个问题,可以在tail.next赋值时,同时更新tail的值。另外,在最后返回head之前,需要判断head是否为空,如果为空,则说明l1和l2的初始值都为null,直接返回null即可。
下面是修改后的代码:
```
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode head = null, tail = null;
int carry = 0;
while (l1 != null || l2 != null) {
int num1 = l1 != null ? l1.val : 0;
int num2 = l2 != null ? l2.val : 0;
int sum = num1 + num2 + carry;
carry = sum / 10;
ListNode node = new ListNode(sum % 10);
if (head == null) {
head = tail = node;
} else {
tail.next = node;
tail = tail.next;
}
if (l1 != null) l1 = l1.next;
if (l2 != null) l2 = l2.next;
}
if (carry > 0) {
tail.next = new ListNode(carry);
tail = tail.next;
}
if (head == null) {
return null;
}
return head;
}
```