题解 | #链表相加(二)#

链表相加(二)

https://www.nowcoder.com/practice/c56f6c70fb3f4849bc56e33ff2a50b6b

链表相加:

  1. 首先判断是否存在某链表为空的情况,存在直接返回另一个链表。
  2. 反转两个链表,便于从最低位开始求和计算。
  3. 初始化进位项carry = 0. 开始逐位求和,将结果保存在节点node中,并连接在以dummy为头节点的链表上。
  4. 若遍历到空节点,则判断是否存在某一条非空的情况。若存在,则与carry项一起考虑继续求和。
  5. 考虑carry是否不为0,若不为0,则额外增加一位。
  6. 最后,以哑节点的下一位节点为头节点的链表进行反转,作为最终结果。
/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
#include <sys/types.h>
class Solution {
    ListNode* reverse(ListNode* head){
        ListNode* pre = nullptr, *next;
        while(head!=nullptr){
            next = head->next;
            head->next = pre;
            pre = head;
            head = next;
        }
        return pre;
    }
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head1 ListNode类 
     * @param head2 ListNode类 
     * @return ListNode类
     */
    ListNode* addInList(ListNode* head1, ListNode* head2) {
        // 若存在某一个链表为空,则直接返回另一个链表
        if(head1==nullptr)  return head2;
        if(head2==nullptr)  return head1;
        // 翻转两个链表
        head1 = reverse(head1);
        head2 = reverse(head2);
        // 定义两个指针
        ListNode* p1 = head1, *p2 = head2;
        ListNode* dummy = new ListNode(-1);
        ListNode* p = dummy;
        int carry = 0;
        while(p1 && p2){
            int num = p1->val + p2->val + carry;
            carry = num/10;
            num = num%10;
            ListNode* node = new ListNode(num);
            p->next = node;
            p = p->next;
            p1 = p1->next;
            p2 = p2->next;
        }
        p1 = p1==nullptr ? p2 : p1;
        while(p1){
            int num = p1->val + carry;
            carry = num/10;
            num %= 10;
            ListNode* node = new ListNode(num);
            p->next = node;
            p = p->next;
            p1 = p1->next;
        }
        if(carry){
            ListNode* node = new ListNode(carry);
            p->next = node;
            p = p->next;
        }
        p = dummy->next;
        p = reverse(p);
        return p;
    }
};

全部评论

相关推荐

点赞 评论 收藏
分享
05-07 17:58
门头沟学院 Java
wuwuwuoow:1.简历字体有些怪怪的,用啥写的? 2.Redis 一主二从为什么能解决双写一致性? 3.乐观锁指的是 SQL 层面的库存判断?比如 stock > 0。个人认为这种不算乐观锁,更像是乐观锁的思想,写 SQL 避免不了悲观锁的 4.奖项证书如果不是 ACM,说实话没什么必要写 5.逻辑过期时间为什么能解决缓存击穿问题?逻辑过期指的是什么 其实也没什么多大要改的。海投吧
点赞 评论 收藏
分享
04-17 10:16
门头沟学院 Java
小浪_coder:24届很难找了,马上25的都毕业了还有很多没找到的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务