首页 > 其他分享 >链表之差的绝对值

链表之差的绝对值

时间:2023-07-30 13:00:34浏览次数:38  
标签:ListNode cur val 之差 next 链表 绝对值 result

假设链表中每一个节点的值都在0-9之间,那么链表整体就可以代表一个非负整数。
给定两个这种链表,请生成代表两个整数之差绝对值结果链表。链表长度最大值为10000,链表任意值0≤val<9
要求:空间复杂度O(n),时间复杂度O(n)
例如:链表1为9->3->7,链表2为9->6->3,最后生成新的结果链表为2-~>6,
不允许使用其它数据结构

实例1:
输入
{1,2,3},{4,5,6}
输出
{3,3,3}
实例2:
输入
{2,2,3},{2,2,7}
输出
{4}
实例3:
输入
{1,1,1},{1,1,1}
输出
{0}

代码示例

#include <iostream>
#include <string>
using namespace std;
struct ListNode {
    int val;
    ListNode* next;
    ListNode(int value) : val(value), next(nullptr) {}
};

ListNode* reverseList(ListNode* head) {
        ListNode* pre = nullptr;
        ListNode* cur = head;
        ListNode* temp = cur;
        while(cur){
            temp = temp->next;
            cur->next = pre;
            pre = cur;
            cur = temp;
        }
        return pre;
}

void print_my(ListNode* pListHead1){
    ListNode* result = pListHead1;
    while (result) {
        std::cout << result->val << " ";
        result = result->next;
    }
    std::cout << std::endl;
}

ListNode* absolute_difference_list(ListNode* pListHead1, ListNode* pListHead2){
    ListNode* new1 = reverseList(pListHead1);
    ListNode* new2 = reverseList(pListHead2);

    ListNode* head = new ListNode(0);
    ListNode* cur = head;
    int borrow = 0; // 借位值
    ListNode* l1 = new1;
    ListNode* l2 = new2;
    while (l1 || l2) {
        int x1 = l1 ? l1->val : 0;
        int x2 = l2 ? l2->val : 0;

        int diff = x1 - x2 - borrow;
        if (diff < 0) {
            borrow = 1;
            diff += 10;
        } else {
            borrow = 0;
        }
        cur->next = new ListNode(diff);
        cur = cur->next;
        if (l1) l1 = l1->next;
        if (l2) l2 = l2->next;
    }
    // 处理最高位的借位
    if (borrow) {
        cur = head->next;
        while(cur && cur->val == 0) cur = cur->next;
        cur->val = 10 - cur->val;
        cur = cur->next;
        while(cur){
            cur->val = 9 - cur->val;
            cur = cur->next;
        }
    }
    head->next = reverseList(head->next);
    // 删除前置0
    ListNode* result = head;
    while (result && result->next && result->next->val == 0) {
        ListNode* temp = result->next;
        result->next = result->next->next;
        delete temp;
    }
    return head->next;;
}


ListNode* absolute_difference_list_LessLongLong(ListNode* pListHead1, ListNode* pListHead2){
    ListNode* new1 = reverseList(pListHead1);
    ListNode* new2 = reverseList(pListHead2);


    unsigned long long num1=0, num2=0;
    ListNode* cur = pListHead1;
    while(cur){
        num1 = num1 * 10 + cur->val;
        cur = cur->next;
    }
    cur = pListHead2;
    while(cur){
        num2 = num2 * 10 + cur->val;
        cur = cur->next;
    }
    unsigned long long res_temp = num1 > num2 ? num1-num2 : num2 -num1;
    string res_str = to_string(res_temp);
    ListNode* pHead = new ListNode(res_str[0]-'0');
    cur = pHead;
    for(size_t i=1;i<res_str.size();i++){
        cur->next = new ListNode(res_str[i]-'0');
        cur = cur->next;
    }
    return pHead;
}



int main() {
    ListNode* l1 = new ListNode(8);
    l1->next = new ListNode(0);
    // l1->next->next = new ListNode(3);

    ListNode* l2 = new ListNode(2);
    l2->next = new ListNode(1);
    l2->next->next = new ListNode(0);

    ListNode* result = absolute_difference_list(l1, l2);

    // // // Output result linked list: 3 -> 3 -> 3, representing integer 333
    while (result) {
        std::cout << result->val << " ";
        result = result->next;
    }


    return 0;
}

标签:ListNode,cur,val,之差,next,链表,绝对值,result
From: https://www.cnblogs.com/xiaohuidi/p/17591296.html

相关文章

  • 代码随想录算法训练营第三天|力扣203.移除链表元素、力扣707.设计链表、力扣206.反转
    链表定义:通过指针串联在一起的线性结构,每一个节点由两个部分组成:数据域和指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null,即为空指针。链表类型1.单链表2.双链表3.循环链表,即链表首尾相连,可以解决约瑟夫环问题链表的存储方式数组在内存中是连续分布的,......
  • 反转链表
    title:反转链表date:2023-07-3009:25:12tags:-c/c++categories:-算法-笔试top:反转链表题目来自acwing题目(点击跳转)定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。思考题:请同时实现迭代版本和递归版本。数据范围链表长度[0,30]......
  • go 链表栈
    packagemainimport"fmt"//链表栈typeLinkStackstruct{root*LinkNode//栈顶sizeint//栈的元素数量}//栈中的结点typeLinkNodestruct{dataintnext*LinkNode}funcNewLinkStack()*LinkStack{return&LinkStack{root:nil,size:0}}//入栈func(link......
  • [代码随想录]Day04-链表part02
    题目:24.两两交换链表中的节点思路:首先给他加一个虚拟头结点,然后思考反转的逻辑,这是每两个为一组,比如1,2是一组、3,4是一组,如果说1,2一组2,3一组就变成了链表的逆转了。那么指针的逻辑是:两个指针一个r指向要交换的二元组的第一个节点一个l指向前一个节点二元组的第二个节......
  • 力扣---141. 环形链表
    给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从0开始)。注意:pos 不作为参数进行传递 。仅仅是为了标......
  • 双链表的插入与删除
    双链表(DoublyLinkedList)是一种链表数据结构,它与单链表相比,在每个节点上都有两个指针,一个指向前一个节点,一个指向后一个节点。这使得在双链表中的插入和删除操作更加灵活。1.双链表插入:在双链表中插入一个节点,需要先找到插入位置的前一个节点,然后通过更新指针的方式将新节点插入......
  • [代码随想录]Day03-链表part01
    题目:203.移除链表元素思路:做链表首先最好有个虚拟头指针,这样做删除添加操作的时候可以统一操作否则还得特判。那删除元素的过程,从虚拟头指针开始要做以下几步:如果当前p的next不为空,那么就可以进行判断如果p的next的值是val(↑p的next不为空↑),那么就把p的next修改为p的下......
  • 代码随想录算法训练营第三天| LeetCode 203.移除链表元素(同时也对整个单链表进行增删
    203.移除链表元素      题目链接/文章讲解/视频讲解::https://programmercarl.com/0203.%E7%A7%BB%E9%99%A4%E9%93%BE%E8%A1%A8%E5%85%83%E7%B4%A0.html    卡哥题目建议:本题最关键是要理解虚拟头结点的使用技巧,这个对链表题目很重要。   做题思路:   ......
  • 数据结构之带头节点的单链表增删改查操作实现
     单链表的定义什么是单链表   单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。   单链表的各个数据元素在物理上可以是离散存放的,每个结点除了存放数据元素外,还要存储指向下一个节点的指针。而顺序表是连续存放的,每个结点中只......
  • 链表/栈/队列/KMP
    链表用数组模拟,不同于结构体加指针调用new关键字开上万级别的节点非常慢,基本会超时单链表来构造邻接表用于存图与树基本结构:head表示头结点的下标e[i]表示节点i的值ne[i]表示节点i的下一个节点的下标idx存储当前已经用到了哪个节点,表示新节点基本操作:......