破解编程面试---链接的加法 (八种编程语言的实现)

破解编程面试---链接的加法 (八种编程语言的实现)

我们有两个非空链表,它们代表两个非负整数。这些数字以相反的顺序存储,并且它们的每个节点都包含一个数字。将两个数字相加,然后将它们作为链接列表返回。

您可能会假设两个数字除了数字0本身以外都不包含任何前导零。

输入:(2-> 4-> 3)+(5-> 6-> 4)

输出:7-> 0-> 8

说明:342 + 465 = 807。

思路

链表节点数据结构中包含值和下一个节点。

两个链表相加要对每个对应元素进行加操作;

如果计算结果超过了10,需要移位到高位;

如果有链表为空了,需要用最后的移位值0或者1对单独的链表中剩余的元素进行加操作;

最后再检查移位值,如果不为零,则添加为新元素。

Javascript:

class ListNode {

constructor(val, next=null) {

    this.val = val;

}

}

addTwoNumbers = (l1, l2)=> {

  let newNode = null;

  let head = null;

  let overTen = 0;

  while(l1 != null && l2 != null) {

    let sum = l1.val + l2.val + overTen;

    let v1 = sum % 10;

    overTen = parseInt(sum / 10);

    if (head == null) {

      head = new ListNode(v1);

      newNode = head;

    }

    else {

      newNode.next = new ListNode(v1);

      newNode = newNode.next;

    }

    l1 = l1.next;

    l2 = l2.next;

  }

  let l = !l1? l2 : l1;

  while(l) {

    let sum = l.val + overTen;

    let v1 = sum % 10;

    overTen = parseInt(sum / 10);

    newNode.next = new ListNode(v1);

    newNode = newNode.next;

    l = l.next;

  }

  if(overTen != 0) {

    newNode.next = new ListNode(overTen);

  }

  return head;

};

{

  let l1 = new ListNode(2);

  l1.next = new ListNode(4);

  l1.next.next = new ListNode(3);

  let l2 = new ListNode(5);

  l2.next = new ListNode(6);

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

  let l = addTwoNumbers(l1, l2);

  while(l != null) {

    console.log(l.val);     

    l = l.next;

  }

  console.log();

}

{

  let l1 = new ListNode(1);

  l1.next = new ListNode(8);

  let l2 = new ListNode(0);

  let l = addTwoNumbers(l1, l2);

  while(l != null) {

    console.log(l.val);     

    l = l.next;

  }

  console.log();

}

Java:

import java.util.*;

public class HelloWorld{

  static class ListNode {

      int val;

      ListNode next;

      ListNode(int x) { val = x; }

  }

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

        ListNode newNode = null;

        ListNode head = null;

        int overTen = 0;

        while(l1 != null && l2 != null){

            int sum = l1.val + l2.val + overTen;

            int v1 = sum % 10;

            overTen = sum / 10;

            if(head == null){

                head = new ListNode(v1);

                newNode = head;

            }

            else{

                newNode.next = new ListNode(v1);

                newNode = newNode.next;

            }

            l1 = l1.next;

            l2 = l2.next;

        }


        ListNode l = l1 == null? l2: l1;


        while(l != null){

            int sum = l.val + overTen;

            int v1 = sum % 10;

            overTen = sum / 10;

            newNode.next = new ListNode(v1);

            newNode = newNode.next; 

            l = l.next; 

        } 

        if(overTen != 0){

           newNode.next = new ListNode(overTen);

        }


        return head;

    }

     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 l = addTwoNumbers(l1, l2);

             while(l != null) {

                System.out.print(l.val);     

                l = l.next;

             }

             System.out.println();

         }

         {

             ListNode l1 = new ListNode(1);

             l1.next = new ListNode(8);

             ListNode l2 = new ListNode(0);

             ListNode l = addTwoNumbers(l1, l2);

             while(l != null) {

                System.out.print(l.val);     

                l = l.next;

             }

             System.out.println();

         }


     }

}

C#:

using System;

class ListNode {

      public int val;

      public ListNode next;

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

}

class HelloWorld {

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

        ListNode newNode = null;

        ListNode head = null;

        int overTen = 0;

        while(l1 != null && l2 != null){

            int sum = l1.val + l2.val + overTen;

            int v1 = sum % 10;

            overTen = sum / 10;

            if(head == null){

                head = new ListNode(v1);

                newNode = head;

            }

            else{

                newNode.next = new ListNode(v1);

                newNode = newNode.next;

            }

            l1 = l1.next;

            l2 = l2.next;

        }


        ListNode l = l1 == null? l2: l1;


        while(l != null){

            int sum = l.val + overTen;

            int v1 = sum % 10;

            overTen = sum / 10;

            newNode.next = new ListNode(v1);

            newNode = newNode.next; 

            l = l.next; 

        } 

        if(overTen != 0){

           newNode.next = new ListNode(overTen);

        }


        return head;

    }     

  static void Main() {


    Console.WriteLine("Hello World");


       {

             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 l = addTwoNumbers(l1, l2);

             while(l != null) {

                Console.Write(l.val);     

                l = l.next;

             }

             Console.WriteLine();

         }

         {

             ListNode l1 = new ListNode(1);

             l1.next = new ListNode(8);

             ListNode l2 = new ListNode(0);

             ListNode l = addTwoNumbers(l1, l2);

             while(l != null) {

                Console.Write(l.val);     

                l = l.next;

             }

             Console.WriteLine();

         }



  }

}

Swift:

import Foundation

public class ListNode {

    public var val: Int

    public var next: ListNode?

    public init(_ val: Int) {

        self.val = val

        self.next = nil

     }

}

func addTwoNumbers(_ la: ListNode?, _ lb: ListNode?) -> ListNode? {

    var l1 = la

    var l2 = lb

    var newNode: ListNode?

    var head: ListNode?

    var overTen: Int = 0

    while (l1 != nil && l2 != nil) {

        var sum: Int = l1!.val + l2!.val + overTen

        var v1 = sum % 10

        overTen = sum / 10

        if( head == nil) {

            head = ListNode(v1)

            newNode = head;

        }

        else {

            newNode!.next =  ListNode(v1)

            newNode = newNode!.next

        }

        l1 = l1!.next

        l2 = l2!.next        

    }

    var l: ListNode? = l1 == nil ? l2 : l1

    while (l != nil) {

        var sum = l!.val + overTen

        var v1 = sum % 10;

        overTen = sum / 10;

        newNode!.next = ListNode(v1);

        newNode = newNode!.next;

        l = l!.next;

    }

    if(overTen != 0) {

        newNode!.next = ListNode(overTen)

    }

    return head

}

func test1() {

    var l1: ListNode? = ListNode(2)

    l1!.next = ListNode(4)

    l1!.next!.next = ListNode(3)

    var l2: ListNode? = ListNode(5)

    l2!.next = ListNode(6)

    l2!.next!.next = ListNode(4)

    var l = addTwoNumbers(l1, l2)

    while(l != nil) {

        print("\(l!.val)", terminator:"")

        l = l!.next

    }

print("\n")

}

func test2() {

    var l1: ListNode? = ListNode(1)

    l1!.next = ListNode(8)

    var l2: ListNode? = ListNode(0)

    var l = addTwoNumbers(l1, l2)

    while(l != nil) {

        print("\(l!.val)", terminator:"")

        l = l!.next

    }

print("\n")

}

test1()

test2()

Kotlin:

import kotlin.properties.Delegates

class ListNode {

    var `val`: Int = 0

    var next: ListNode? = null

    constructor(v: Int) {

        this.`val` = v

    }

}

fun addTwoNumbers(la: ListNode?, lb: ListNode?): ListNode? {

    var l1: ListNode? = la

    var l2: ListNode? = lb

    var newNode: ListNode? = null

    var head: ListNode? = null

    var overTen: Int = 0

    while (l1 != null && l2 != null) {

        var sum: Int = l1?.`val` + l2?.`val` + overTen

        var v1 = sum % 10

        overTen = sum / 10

        if (head == null) {

            head = ListNode(v1)

            newNode = head;

        } else {

            newNode?.next = ListNode(v1)

            newNode = newNode?.next

        }

        l1 = l1?.next

        l2 = l2?.next

    }

    var l: ListNode? = l1

    if (l1 == null) {

        l = l2

    }

    while (l != null) {

        var sum = l?.`val` + overTen

        var v1 = sum % 10;

        overTen = sum / 10;

        newNode?.next = ListNode(v1);

        newNode = newNode?.next;

        l = l?.next;

    }

    if (overTen != 0) {

        newNode?.next = ListNode(overTen)

    }

    return head

}

fun main() {

    test1()

    test2()

}

private fun test1() {

    var l1: ListNode? = ListNode(2)

    l1?.next = ListNode(4)

    l1?.next?.next = ListNode(3)

    var l2: ListNode? = ListNode(5)

    l2?.next = ListNode(6)

    l2?.next?.next = ListNode(4)

    var l = addTwoNumbers(l1, l2)

    while (l != null) {

        print("${l.`val`}")

        l = l?.next

    }

    println()

}

private fun test2() {

    var l1: ListNode? = ListNode(1)

    l1?.next = ListNode(8)

    var l2: ListNode? = ListNode(0)

    var l = addTwoNumbers(l1, l2)

    while (l != null) {

        print("${l.`val`}")

        l = l?.next

    }

    println()

}

Python:

class ListNode:

    def __init__(self, x):

        self.val = x

        self.next = None

def addTwoNumbers(l1: ListNode, l2: ListNode) -> ListNode:

    newNode = None

    head = None

    overTen = 0

    while l1 != None and l2 != None:

        sum = l1.val + l2.val + overTen

        v1 = sum % 10

        overTen = int(sum / 10)

        if head == None:

            head = ListNode(v1)

            newNode = head

        else:

            newNode.next = ListNode(v1);

            newNode = newNode.next

        l1 = l1.next

        l2 = l2.next


    l = l1 if l1 != None else l2

    while l != None:

        v1 = l.val

        if overTen != 0:

            sum = l.val + overTen

            v1 = sum % 10

            overTen = int(sum / 10)

        newNode.next = ListNode(v1);

        newNode = newNode.next

        l = l.next

    if overTen != 0:

        newNode.next = ListNode(overTen);

    return head

def test1():

    l1 = ListNode(2)    

    l1.next = ListNode(4)    

    l1.next.next = ListNode(3)


    l2 = ListNode(5)

    l2.next = ListNode(6)

    l2.next.next = ListNode(4)


    l = addTwoNumbers(l1, l2)

    while l != None:

        print(l.val, end = '')

        l = l.next


    print()

def test2():

    l1 = ListNode(1)    

    l1.next = ListNode(8)    


    l2 = ListNode(0)

    l = addTwoNumbers(l1, l2)

    while l != None:

        print(l.val, end = '')

        l = l.next

    print()

test1()

test2()

C++:

#include

#include

 struct ListNode {

     int val;

     ListNode *next;

     ListNode(int x) : val(x), next(NULL) {}

 };

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {

    ListNode *newNode = 0;

    ListNode *head = 0;

    int overTen = 0;

    while(l1 != 0 && l2 != 0) {

        int sum = l1->val + l2->val + overTen;

        int v1 = sum % 10;

        overTen = sum /10;

        if(head == 0){

            head = new ListNode(v1);

            newNode = head;

        }

        else {

            newNode->next = new ListNode(v1);

            newNode = newNode->next;

        }

        delete l1;

        delete l2;

        l1 = l1->next;

        l2 = l2->next;

    }


    ListNode* l = l1 != NULL ? l1: l2;

    while(l != NULL) {

        int v1 = l->val;

        if(overTen != 0){

            int sum = l->val + overTen;

            v1 = sum % 10;

            overTen = sum / 10;

        }

        newNode->next = new ListNode(v1);

        newNode = newNode->next; 

        delete l;

        l = l->next; 

    }

    if(overTen != 0) {

        newNode->next = new ListNode(overTen);

    }

    return head;

}

void test1 () {

    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 *l = addTwoNumbers(l1, l2);


    while(l != NULL) {

        std::cout << l->val;

        delete l;

        l = l->next;

    }

    std::cout << std::endl;

}

void test2 () {

    ListNode *l1 = new ListNode(1);

    l1->next = new ListNode(8);

    ListNode *l2 = new ListNode(0);

    ListNode *l = addTwoNumbers(l1, l2);


    while(l != NULL) {

        std::cout << l->val;

        delete l;

        l = l->next;

    }

    std::cout << std::endl;

}

int main()

{

    test1();

    test2();

    return 0;

}

Golang:

package main

import (

"fmt"

)

type ListNode struct {

    Val int

    Next *ListNode

}

func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {

    var newNode *ListNode = nil

    var head *ListNode = nil

    var overTen = 0

    for l1 != nil && l2 != nil {

sum := l1.Val + l2.Val + overTen

v1 := sum % 10

        overTen = sum /10


        if head == nil {

            head = &ListNode{Val: v1}

            newNode = head

        } else  {

            newNode.Next = &ListNode{Val: v1}

            newNode = newNode.Next

        }

l1 = l1.Next

        l2 = l2.Next

    }

    l := l1

    if l1 == nil {

        l = l2

    }

    for l != nil {

        v1 := l.Val;

        if overTen != 0{

            sum := l.Val + overTen

            v1 = sum % 10

            overTen = sum / 10

        }

        newNode.Next = &ListNode{Val: v1}

        newNode = newNode.Next

        l = l.Next

    }

    if overTen != 0 {

        newNode.Next = &ListNode{Val: overTen }

    }

    return head    

}

func test1() {

    l1 := &ListNode {Val: 2}

    l1.Next = &ListNode {Val: 4}

    l1.Next.Next = &ListNode {Val: 3}

    l2 := &ListNode {Val: 5}

    l2.Next = &ListNode {Val: 6}

    l2.Next.Next = &ListNode {Val: 4}

    l := addTwoNumbers(l1, l2)

    for l != nil {

        fmt.Printf("%d", l.Val)

        l = l.Next

    }

    fmt.Println();

}

func test2() {

    l1 := &ListNode {Val: 1}

    l1.Next = &ListNode {Val: 8}

    l2 := &ListNode {Val: 0}

    l := addTwoNumbers(l1, l2)

    for l != nil {

        fmt.Printf("%d", l.Val)

        l = l.Next

    }

    fmt.Println();

}

func main() {

    test1()

test2()

}

破解编程面试---链接的加法 (八种编程语言的实现)_第1张图片

你可能感兴趣的:(破解编程面试---链接的加法 (八种编程语言的实现))