NC40 链表相加(二)
文章目录
- 一、读题
- 二、思路
- 三、代码实现:
一、读题
题目来源: 链表相加
https://www.nowcoder.com/practice/c56f6c70fb3f4849bc56e33ff2a50b6b?tpId=196&tqId=37147&ru=/exam/oj
二、思路
思路很简单:
第一种:模拟字符串数字相加,把链表遍历一遍,然后把对应的数据取出来组合成为字符串,然后再相加,再将一位一位的数字放入链表,最终还要逆置一下链表,
第二种:将链表逆置,因为这是一个单链表,只能顺着取数据(高位到低位),不能逆过来取数据,但是我们的加法只能够从低位到高位计算,因此我们可以将链表逆置,这样子我们从左往右取就能够实现从低位开始取,但是此时拿到的还是逆序的,我们每计算一位就将数据存储进入链表,最后再逆置即可
这道题难就难在逆置链表这一方面,主包个人认为这一道题本质上是在考链表的逆置
链表逆置我们可以先创建一个头节点,然后再采用头插法将剩下的元素插入,先将要新插入的节点的next指向head的next,然后head的next再指向要新插入的节点,这样就可以避免丢失节点的情况
但是在编写逆置链表的方法的时候还需要注意头节点的保留,避免逆置到后面找不到头节点了
需要注意一点,在判断当前节点是否为空后,如果不为空就进行计算,算完就要将当前节点移动到下一个节点,一定不能在外面移动,一定不能在外面移动,一定不能在外面移动,重要的事情说三遍,如果在外面移动的话会出现越界的情况,当head为空之后仍然使用head.next的时候就会出现越界的情况
三、代码实现:
import java.util.*;/** public class ListNode {* int val;* ListNode next = null;* public ListNode(int val) {* this.val = val;* }* }*/public class Solution {public ListNode func(ListNode pHead) {if (pHead == null)return null;ListNode cur = pHead;ListNode pre = null;while (cur != null) {//断开链表,要记录后续一个ListNode temp = cur.next;//当前的next指向前一个cur.next = pre;//前一个更新为当前pre = cur;//当前更新为刚刚记录的后一个cur = temp;}return pre;}public ListNode addInList (ListNode head1, ListNode head2) {head1 = func(head1);head2 = func(head2);ListNode cur1 = head1, cur2 = head2;ListNode ans = new ListNode(0) , prev = ans;int flag = 0;while (cur1 != null || cur2 != null || flag != 0) {if (cur1 != null) {flag += cur1.val;cur1 = cur1.next;}if (cur2 != null) {flag += cur2.val;cur2 = cur2.next;}prev = prev.next = new ListNode(flag % 10);flag /= 10;}return func(ans.next);//最后一定要记得是从头节点的下一个节点进行逆置}
}