算法日常练习9.20

 链表的两数相加,没用什么高端的算法,就是计算每个端点的和,如果不大于10就直接加上去,不然就进1再加,加到后面一个链表没了就当做是0,两个链表都没了还是要看是否向前进了1,想法不难,但写法很巧妙,可以多看看理解

/**
 * 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; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode root=new ListNode();
        ListNode p=root;
        int add=0;
        while(l1!=null||l2!=null||add!=0){
            int a=l1==null?0:l1.val;
            int b=l2==null?0:l2.val;
            int sum=a+b+add;
            add=sum/10;
            p.next=new ListNode(sum%10);
            p=p.next;
            l1=l1==null?l1:l1.next;
            l2=l2==null?l2:l2.next;
        }
        return root.next;
    }
}

 该题想法也很简单,就是一个指针保存奇数的链表,一个保存偶数的,最后把偶数的接在奇数后面就行,但是实现起来也要注意细节

class Solution {
    public ListNode oddEvenList(ListNode head) {
        if(head==null||head.next==null) return head;
        ListNode even=new ListNode();
        even.next=head.next;
        ListNode root=head;
        ListNode p=even;
        while(head!=null&&p!=null){
            if(head.next==null) break;
            p.next=head.next;
            p=p.next;
            if(p.next==null) break;
            head.next=p.next;
            head=head.next;
            
        }
        p.next=null;
       head.next=even.next;
        return root;
    }
}

 三种想法,最简单的就是用set先保存a的节点,在遍历b的节点,已经存在了就可以返回了

第二种就是计算长度,长的先走到和短的同一个位置,再一起走,走到相同位置返回

第三种双指针,指针a从a开始走,指针b从b开始走,如果走完了a从b再走,b从a再走,就这样循环,要么在相同节点相遇,要么在末尾相遇

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        int lenA=0;
        int lenB=0;
        ListNode pa=headA;
        ListNode pb=headB;
        while(pa!=null){
            lenA++;
            pa=pa.next;
        }
        while(pb!=null){
            lenB++;
            pb=pb.next;
        }
        int diff=lenA-lenB;
        if(diff>0){
            for(int i=0;i<diff;i++){
                headA=headA.next;
            }
        }
        if(diff<0){
            while(diff<0){
                headB=headB.next;
                diff++;
            }
        }
        while(headA!=null){
            if(headA==headB) return headA;
            headA=headA.next;
            headB=headB.next;
        }
        return null;
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值