美文网首页
2022-02-24 025,024 链表反转,链表中的两数相

2022-02-24 025,024 链表反转,链表中的两数相

作者: 16孙一凡通工 | 来源:发表于2022-02-24 10:49 被阅读0次

链表反转:
思路采用栈,而栈可以用slice的思路实现
Go版本

func reverseList(head *ListNode) *ListNode {

    // 数组slice当作stack
    stack:=[]int{}
    for head!=nil{
        stack=append(stack,head.Val);
        head=head.Next
    }
    if len(stack)==0{
        return nil
    }
    ans:=&ListNode{Val:stack[len(stack)-1]};
    res:=ans;
    stack=stack[:len(stack)-1]
    for len(stack)>0{
        temp:=stack[len(stack)-1]
        stack=stack[:len(stack)-1]
        node:=&ListNode{Val:temp}
        res.Next=node
        res=res.Next
    }
    return ans;

}

链表两数相加:
纯粹的反转相加,注意考虑类似于l1=[5],l2=[5]的情况
Go版本

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

    // l1,l2非空链表反转
    l1_reverse,l1_count:=reverse(l1);
    l2_reverse,l2_count:=reverse(l2);
    ans:=&ListNode{Val:0}
    res:=ans;
    min_count:=0;
    // 计算链表长度
    if l1_count>l2_count{
        min_count=l2_count
        // max_count=l1_count;
    }else{
        min_count=l1_count
        // max_count=l2_count-l1_count;
    }
    temp:=0 //表示进

    for min_count>0{
        Value:=l1_reverse.Val+l2_reverse.Val+temp
        temp=0;
        if Value>=10{
           Value=Value-10;
           temp=1;  
        }else{
            Value=Value;
        }
        //  fmt.Print(l1_reverse.Val,l2_reverse.Val,Value)
        //  fmt.Println()
         
        node:=&ListNode{Val:Value}
        l1_reverse=l1_reverse.Next
        l2_reverse=l2_reverse.Next
        res.Next=node;
        res=res.Next;
        min_count--;
        l1_count--;
        l2_count--;   
    }
  
    LastNode:=&ListNode{}
    if l1_count!=0{
        LastNode=l1_reverse;
    }else{
        LastNode=l2_reverse;
    }
   
    for LastNode!=nil || temp!=0{
         if LastNode==nil{
                LastNode=&ListNode{Val:0};
                
            }
        
         Value:=LastNode.Val+temp
          temp=0;
        if Value>=10{
           Value=Value-10;
           temp=1;  
        }else{
            Value=Value;
        }
        node:=&ListNode{Val:Value}
        res.Next=node;
        res=res.Next;
        LastNode=LastNode.Next
        
    }
    ans_reverse,_:=reverse(ans.Next)
return ans_reverse;

}
func reverse(head *ListNode)(*ListNode,int){
    stack:=[]int{};
    count:=0
    for head!=nil{
        stack=append(stack,head.Val)
        head=head.Next
        count++;
    }
    ans:=&ListNode{Val:stack[len(stack)-1]}
    stack=stack[:len(stack)-1]
    res:=ans;
    for(len(stack)>0){
        node:=&ListNode{Val:stack[len(stack)-1]}
        stack=stack[:len(stack)-1]
        res.Next=node
        res=res.Next
        
    }
    return ans,count;
}

相关文章

  • 2022-02-24 025,024 链表反转,链表中的两数相

    链表反转:思路采用栈,而栈可以用slice的思路实现Go版本 链表两数相加:纯粹的反转相加,注意考虑类似于l1=[...

  • algrithrom

    求和问题,双指针解决 done 两数之和 三数之和 最接近三数之和 四数之和 链表反转问题 done 链表反转 链...

  • Algorithm小白入门 -- 单链表

    单链表递归反转链表k个一组反转链表回文链表 1. 递归反转链表 单链表节点的结构如下: 1.1 递归反转整个单链表...

  • 剑指offer 15~17

    15.反转链表输入一个链表,反转链表后,输出链表的所有元素。 16.合并两个排序的链表输入两个单调递增的链表,输出...

  • 腾讯优图常见算法题

    最常见的: 一、 两数之和 二、链表反转 三、环状链表 四、快排 五、合并两个有序链表 六、最大子序和 七、最长上...

  • 链表

    链表基本操作 从尾到头打印链表 删除链表的节点 链表中倒数第K个节点 反转链表 合并两个有序链表 两个链表的第一个...

  • LeetCode链表专题

    (一)LeetCode206.反转链表 题目描述: 反转一个单链表。 代码实现 (二)LeetCode160. 相...

  • 5个链表的常见操作

    链表 链表反转 LeetCode206:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 环路检...

  • JZ-015-反转链表

    反转链表 题目描述 输入一个链表,反转链表后,输出新链表的表头。题目链接: 反转链表[https://www.no...

  • 链表

    反转链表 输入一个链表,输出该链表中倒数第k个结点。 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需...

网友评论

      本文标题:2022-02-24 025,024 链表反转,链表中的两数相

      本文链接:https://www.haomeiwen.com/subject/rxlzlrtx.html