LeetCode刷题之旅(中等 -1):两数相加

2019年9月4日

 

题目:

 

解决方法:

1、双指针,链表遍历,逐位相加

package leetCode.middle;

/**
 * leetCode:middle 2 两数相加
 *
 * @author moubin.mo
 * @date: 2019/9/4 16:59
 */

public class SumOfTwoLinks {

	public static void main(String [] args){
		ListNode l1 = new ListNode(2);
		l1.next = new ListNode(4);
		l1.next.next = new ListNode(3);

		ListNode l2 = new ListNode(5);
		l2.next = new ListNode(6);
		l2.next.next = new ListNode(4);

		ListNode result = addTwoNumbers(l1, l2);

		while (result != null){
			System.out.print(result.val);
			result = result.next;
		}
	}

	public static ListNode addTwoNumbers(ListNode l1, ListNode l2){

		// 双指针
		ListNode l4 = new ListNode(0);
		ListNode l3 = l4;

		// 进位标志
		int flag = 0;

		// 位运算
		while (l1 != null || l2 != null){

			// 求和
			int val1 = l1==null ? 0 :l1.val;
			int val2 = l2==null ? 0 :l2.val;
			int sum = val1 + val2 + flag;

			// 计算进位
			flag = sum / 10;
			sum = sum % 10;

			// 创建新节点
			l3.next = new ListNode(sum);

			// 将游标值设置进目标链表
			l3 = l3.next;
			l1 = (l1 != null)?l1.next:null;
			l2 = (l2 != null)?l2.next:null;

		}

		// 设置最高位元素
		if (flag > 0) {
			l3.next = new ListNode(flag);
		}

		return l4.next;
	}

}

/** 一个节点 */
class ListNode{
	int val;
	ListNode next;

	public ListNode(int val) {
		this.val = val;
	}
}

思路:

  • 遍历两个链表,直到两个链表都被遍历结束,此时如有进位,游标指针会指向最高位,跳出循环后创建最高位节点;

 

性能结果:

 

2、网友解法:

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode resultList = new ListNode(0);
        int cache = 0;
        
        ListNode l3 = resultList;
        while (l1 != null || l2 != null || cache > 0){
            int l1Val = l1 == null ? 0 : l1.val;
            int l2Val = l2 == null ? 0 : l2.val;
            int l3Val = l1Val + l2Val + cache;
            cache = 0;
            
            // 判断是否大于 9 大于9 进一位
            if (l3Val >  9){
                cache = 1;
                l3Val = l3Val - 10;
            }
            
            l3.next = new ListNode(l3Val);
            
            l3 = l3.next;
            l1 = l1 == null ? l1 : l1.next;
            l2 = l2 == null ? l2 : l2.next;
        }
        
        return resultList.next;
    }
}

作者:zhaoyuening
链接:https://leetcode-cn.com/problems/add-two-numbers/solution/zhi-xing-yong-shi-8-ms-nei-cun-xiao-hao-406-mb-by-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

思路:

  •  8 ms 内存消耗 : 40.6 MB
  • 区别在这个进位方式,用的是判断;这里有个知识点:在计算机运算中,除法是比逻辑判断要消耗资源的,所以这里做了一个改善(虽然不好看,但确实结果显示更好了)

其他:

寄语自己,过去的两个月,工作实在太饱和了,导致没有时间来提高程序员内功,现在这段时间没有那么忙,可以安静下来好好听歌写代码了。加油,这毕竟只是中等级别的一题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值