【机试题】两个链表相减,并以相同形式返回一个表示相减结果的链表

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照顺序的方式存储的,并且每个节点只能存储一位数字。
请你将两个数相减,并以相同形式返回一个表示相减结果的链表。
你可以假设
1)除了数字 0 之外,这两个数都不会以 0 开头。
2)给定的第一数字一定比第二个数字大。
举例:
输入:l1 = [9,8,7], l2 = [5,1,2]
输出:[4,7,5]
解释:987-512 = 475

public class Test3 {

}

class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
        val = x;
    }
}

public class Solution {
    public ListNode subtractTwoNumbers(ListNode l1, ListNode l2) {
        ListNode dummy = new ListNode(0); // 创建一个虚拟头节点
        ListNode p1 = l1, p2 = l2; // 分别用p1和p2指向两个链表
        int carry = 0; // 初始化进位为0
        ListNode tail = dummy; // tail指向新链表的最后一个节点

        while (p1 != null || p2 != null) { // 当两个链表都不为空时
            int sub = (p1 != null) ? p1.val : 0 - (p2 != null) ? p2.val : 0 - carry; // 计算当前位的差值
            carry = Math.max(0, sub); // 计算进位
            tail.next = new ListNode(sub); // 将差值存储到新链表中
            tail = tail.next; // tail指向新链表的下一个节点
            p1 = p1 != null ? p1.next : null; // p1指向下一个节点
            p2 = p2 != null ? p2.next : null; // p2指向下一个节点
        }
        if (carry > 0) { // 如果还有进位,则需要在新链表的开头添加一个节点
            tail.next = new ListNode(carry);
        }
        return dummy.next; // 返回新链表
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
为了实现两个链表相减操作,我们可以按照从低位到高位的顺序逐个计算每一位的差值,并将结果保存在一个新的链表中。具体步骤如下: 1. 创建一个新的链表,用于存储相减结果。 2. 初始化两个指针分别指向两个链表的头节点。 3. 创建一个变量 borrow,用于记录借位情况,初始值为0。 4. 遍历两个链表,直到两个链表都为空。 4.1 获取当前节点的值,如果链表已经遍历完,则将该值设为0。 4.2 计算当前位的差值,加上前一位的借位。 4.3 如果差值小于0,则需要向高位借位,并将 borrow 设置为1。 4.4 将差值的绝对值加入到新链表中,并更新指针位置。 5. 如果最后一位存在借位(borrow=1),则在新链表的最高位添加一个值为1的节点。 6. 返回链表作为相减结果。 以下是一个示例的 Python 实现: ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def subtractTwoNumbers(l1: ListNode, l2: ListNode) -> ListNode: dummy = ListNode() curr = dummy borrow = 0 while l1 or l2: val1 = l1.val if l1 else 0 val2 = l2.val if l2 else 0 diff = val1 - val2 - borrow if diff < 0: borrow = 1 diff += 10 else: borrow = 0 curr.next = ListNode(diff) curr = curr.next if l1: l1 = l1.next if l2: l2 = l2.next if borrow: curr.next = ListNode(1) return dummy.next ``` 希望以上解答能够满足你的需求。如果你还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ThinkPet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值