题解 | 链表相加(二)

链表相加(二)

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

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    // 反转链表函数
    ListNode* rever(ListNode* head) {
        ListNode* pre = nullptr;
        ListNode* cur = head;
        ListNode* nex = nullptr;
        while (cur) {
            nex = cur->next;  // 保存下一个节点
            cur->next = pre;  // 反转当前节点指针
            pre = cur;        // 更新前驱节点
            cur = nex;        // 移动到下一个节点
        }
        return pre;  // 返回新头节点(原尾节点)
    }

    ListNode* addInList(ListNode* head1, ListNode* head2) {
        // 反转两个链表,使低位在前
        ListNode* p1 = rever(head1);
        ListNode* p2 = rever(head2);
        
        // 创建虚拟头节点,简化链表操作
        ListNode* dummy = new ListNode(0);
        ListNode* cur = dummy;  // 当前节点指针
        int carry = 0;          // 进位标志(初始为0)

        // 遍历两个链表,处理所有节点和进位
        while (p1 != nullptr || p2 != nullptr || carry != 0) {
            // 计算当前位总和(节点值+进位)
            int sumVal = carry;
            if (p1 != nullptr) {
                sumVal += p1->val;
                p1 = p1->next;  // 移动到下一位
            }
            if (p2 != nullptr) {
                sumVal += p2->val;
                p2 = p2->next;  // 移动到下一位
            }

            // 计算当前位值和新进位
            carry = sumVal / 10;        // 进位(0或1)
            int currentVal = sumVal % 10;  // 当前位值(个位)

            // 创建新节点并拼接
            cur->next = new ListNode(currentVal);
            cur = cur->next;  // 移动到新节点
        }

        // 反转结果链表,恢复高位在前的顺序
        ListNode* result = rever(dummy->next);
        return result;
    }
};

全部评论

相关推荐

小浪_Coding:1. 个人技能排版太乱, 写的技术栈太浅了, 跟测试,自动化相关的太少; 2. 项目开发类的太简单没有亮点, 算法类的项目建议只放一个,最好有自动化,CI/CD, pipline的项目, 需要更换; 3.整体排版需要优化, SOOB打招呼都需要注意等.
我的简历长这样
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务