Java資料結構與演算法面試題-兩數之和 作者:哇塞大嘴好帥
Java資料結構與演算法面試題-兩數之和 作者:哇塞大嘴好帥
作者:哇塞大嘴好帥
哇塞大嘴好帥
1.題目 -該題目由LeetCode提供
ou are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order, and each of their nodes contains a single digit. Add the two numbers and return the sum as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Example 1:
Input: l1 = [2,4,3], l2 = [5,6,4]
Output: [7,0,8]
Explanation: 342 + 465 = 807.
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/add-two-numbers
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
2.完整程式碼
package com.dazuizui.兩數相加;
/**
* You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order, and each of their nodes contains a single digit. Add the two numbers and return the sum as a linked list.
*
* You may assume the two numbers do not contain any leading zero, except the number 0 itself.
*
* 來源:力扣(LeetCode)
* 連結:https://leetcode-cn.com/problems/two-sum
* 著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
* @author Yida·Yang
* @Time 2020-11-25
* @Text 連結串列管理
*/
public class Demo1 {
public static void main(String[] args) {
NodeAdmin nodeAdmin = new NodeAdmin();
nodeAdmin.addNode(1);
nodeAdmin.addNode(2);
nodeAdmin.addNode(4);
nodeAdmin.addNode(5);
NodeAdmin nodeAdmin1 = new NodeAdmin();
nodeAdmin1.addNode(1);
nodeAdmin1.addNode(2);
nodeAdmin1.addNode(4);
nodeAdmin1.addNode(5);
nodeAdmin1.selectLinkenList();
Solution solution = new Solution();
ListNode listNode = solution.addTwoNumbers(nodeAdmin.getHead(), nodeAdmin1.getHead());
}
}
/**
* 面試題 兩數相加
* @author Yida·Yang
* @Time 2020-11-25
* @Text 兩數相加
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//建立頭節點,尾巴節點
ListNode head = null,foot = null;
//進位
int carry = 0;
//和
int sum = 0;
//兩數相加操作
while(true){
int num1 = l1 != null ? l1.val : 0;
int num2 = l2 != null ? l2.val : 0;
sum = num1 + num2 +carry;
if(head == null){
head = foot = new ListNode(sum % 10);
}else {
foot.next = new ListNode(sum % 10);
foot = foot.next;
System.out.println("sum:"+sum+" foot = "+foot.val);
}
carry = sum / 10;
//指標下移動
if (l1 != null){
l1 = l1.next;
}
if (l2 != null){
l2 = l2.next;
}
if(l2 == null && l1 == null){
break;
}
}
if (carry > 0){
foot.next = new ListNode(carry) ;
System.out.println(foot.next.val);
}
return head;
}
}
/**
* @author Yida·Yang
* @Time 2020-11-25
* @Text 連結串列管理
*/
class NodeAdmin{
ListNode head = new ListNode();
//獲取當前節點
public ListNode getHead(){
return this.head;
}
//新增一個連結串列
public void addNode(int val) {
//建立臨時遍歷
ListNode temp = head;
//如果頭節點為NULL
while (true){
if(temp.next == null){
break;
}
temp = temp.next;
}
temp.next = new ListNode(val);
System.out.println("新增temp:"+temp);
}
//瀏覽連結串列
public void selectLinkenList(){
//建立臨時遍歷
ListNode temp = head.next;
while (true){
if (temp == null){
break;
}
System.out.println(temp.val);
temp = temp.next;
}
}
}
/**
* @author Yida·Yang
* @Time 2020-11-25
* @Text 連結串列節點
*/
class ListNode {
int val;
ListNode next;
ListNode() {}
@Override
public String toString() {
return "ListNode{" +
"val=" + val +
", next=" + next +
'}';
}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
3.程式碼解析
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
* @author 哇塞大嘴好帥
* @blogurl www.dazuizui.com
* @e-mail y51288033@outlook.com
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//建立頭節點,尾節點。
ListNode head = null,foot = null;
//進位
int carry = 0;
//和
int sum = 0;
//兩數相加操作
while(true){
int num1 = l1 != null ? l1.val : 0;
int num2 = l2 != null ? l2.val : 0;
sum = num1 + num2 + carry;
//計算
if(head == null){
head = foot = new ListNode(sum % 10);
}else{
foot.next = new ListNode(sum % 10);
foot = foot.next;
}
//計算進位數
carry = sum / 10;
//尾指標下移
if(l1 != null){
l1 = l1.next;
}
if(l2 != null){
l2 = l2.next;
}
//如果其中有一者為NULL則跳出迴圈
if(l1 == null && l2 == null){
break;
}
}
if(carry > 0){
foot.next = new ListNode(carry);
}
return head;
}
}
首先定義頭節點,還有臨時變數(臨時變數要永遠指向最後一個節點),之後在定義兩個遍歷一個和一個進位,之後進入while迴圈 如果head == null 成立就代表是第一個節點,如果是第一個節點就把頭和尾節點都賦值為sum % 10,如果不是第一個節點就臨時變數的下一個節點 = new ListNode(sum % 10); 然後指標下移,之後就是指標下移判斷,如果兩者連結串列(l1 and l2)都為null 那麼就代表兩數相加操作已經做完了就跳出迴圈,跳出迴圈後判斷是否有進位,如果有進位,就尾節點的下一個**= new ListNode(carry);** 之後返回頭節點。
相關文章
- Linux安裝Nginx 作者:哇塞大嘴好帥LinuxNginx
- 好題——數學與資料結構資料結構
- 基礎面試題 — 資料結構與演算法面試題資料結構演算法
- 資料結構與演算法面試題80道資料結構演算法面試題
- 資料結構和演算法面試題系列—數字題總結資料結構演算法面試題
- 資料結構與演算法——兩個大整數的乘積問題資料結構演算法
- 演算法-兩數之和演算法
- 資料結構與演算法(java)資料結構演算法Java
- 演算法、資料結構 常見面試題演算法資料結構面試題
- 資料結構與演算法常見問題(面試題)不定時更新資料結構演算法面試題
- 資料結構與演算法(java版)資料結構演算法Java
- 力扣演算法經典第一題——兩數之和(Java兩種方式實現)力扣演算法Java
- 資料結構和演算法面試題系列—棧資料結構演算法面試題
- 資料結構和演算法面試題系列—字串資料結構演算法面試題字串
- 力扣 170. 兩數之和 III - 資料結構設計 two-sum III力扣資料結構
- 資料結構和演算法面試題系列—連結串列資料結構演算法面試題
- Java資料結構與排序演算法 (二)Java資料結構排序演算法
- Java資料結構與排序演算法 (三)Java資料結構排序演算法
- Java資料結構與排序演算法 (一)Java資料結構排序演算法
- 每日一道演算法題:1.兩數之和演算法
- 一個小小的演算法題:求兩數之和演算法
- 兩數之和
- 資料結構與演算法入門題資料結構演算法
- 資料結構與演算法——基數排序簡單Java實現資料結構演算法排序Java
- 兩數之和(leecode)的演算法演算法
- 資料結構與演算法-資料結構(棧)資料結構演算法
- 資料結構和演算法面試題系列—揹包問題總結資料結構演算法面試題
- 資料結構和演算法面試題系列—遞迴演算法總結資料結構演算法面試題遞迴
- 資料結構和演算法面試題系列—隨機演算法總結資料結構演算法面試題隨機
- 資料結構與演算法——常用高階資料結構及其Java實現資料結構演算法Java
- 演算法題:三數之和演算法
- 簡單演算法題:leetcode-1 兩數之和演算法LeetCode
- [面試專題]資料結構和演算法-JS之魂面試資料結構演算法JS
- 資料結構面試100題資料結構面試
- 【Java資料結構與演算法筆記(一)】常見排序演算法及面試考點總結Java資料結構演算法筆記排序面試
- 資料結構與演算法——排序演算法-基數排序資料結構演算法排序
- 資料結構和演算法面試題系列—二叉樹面試題彙總資料結構演算法面試題二叉樹
- 每日一道演算法, 《兩數之和》演算法