两个链表生成相加链表--牛客网算法题

两个链表生成相加链表

题目:
假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。
给定两个这种链表,请生成代表两个整数相加值的结果链表。
例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。
示例1
输入
复制
[9,3,7],[6,3]
返回值
复制
{1,0,0,0}

说下我的思路:
1.相加因为有可能进位,所以是从后向前加,但是链表是单向链表,这时我们会想起栈这个数据结构。
2.把两个链表的值分别压入栈中再相加不就是从后向前加了吗。但是还要考虑进位的问题。
3.我是通过和10比较分别进入两段逻辑,比10小的直接添加节点就行了,比10大的就要减10,对下一个数字加1.然后把减过的数生成节点添加到链表。
下面把代码贴出来:
public static ListNode addInList (ListNode head1, ListNode head2) {
// write code here
Stack stack1 = new Stack<>();
Stack stack2 = new Stack<>();

    while(head1 != null){
        stack1.push(head1.val);
        head1 = head1.next;
    }

    while(head2 != null){
        stack2.push(head2.val);
        head2 = head2.next;
    }
    Integer result = 0;
    Integer s1 = 0;
    Integer s2 = 0;
    ListNode n1 = new ListNode(0);
    ListNode head = new ListNode(0);
    while(!stack1.isEmpty() || !stack2.isEmpty()){
        if(!stack1.isEmpty()){
            s1 = stack1.pop();
        }else{
            s1 = 0;
        }
        if(!stack2.isEmpty()){
            s2 = stack2.pop();
        }else{
            s2 = 0;
        }
        result = s1 + s2;
        ListNode temp = new ListNode(0);
        if(result < 10){
            temp.val = result;
            temp.next = n1;
            n1 = temp;
        }else{
            Integer res = result - 10;
            Integer sta = 0;
            if(stack1.size() >= 1){
                sta = stack1.pop();
                sta += 1;
            }else{
                sta = 1;
            }

            stack1.push(sta);
            temp.val = res;
            temp.next = n1;
            if(head == null){
                head = n1;
            }
            n1 = temp;
        }
    }
    ListNode frist = n1;
    while (frist.next.next != null){
        frist = frist.next;
    }
    frist.next = null;

    return n1;

}

总结:
这次用的栈做的,其实也可以用其他数据结构,在做这样类型的算法题时,多考虑用数据结构的思路就会很容易做出来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值