多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
#链表 >1.有一个整数val,如何在节点值有序的环形链表中插入一个节点值为val的节点,并且保证这个环形单链表依然有序。 给定链表的信息,及元素的值A及对应的nxt指向的元素编号同时给定val,请构造出这个环形链表,并插入该值。 测试样例: [1,3,4,5,7],[1,2,3,4,0],2 返回:{1,2,3,4,5,7} ~~~ import java.util.*; class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } public class InsertValue { public ListNode insert(int[] A, int[] nxt, int val) { if(A==null||A.length==0){ return new ListNode(val); } ListNode head = new ListNode(A[0]); ListNode p = head; for(int i=0;i<A.length-1;i++){ p.next = new ListNode(A[nxt[i]]); p = p.next; } p.next=null;//p.next=head变成环OJ上过不了。 ListNode pre = head; ListNode next = head.next; ListNode newNode = new ListNode(val); while(next!=null){ if(val>=pre.val&&val<=next.val){ break; } pre = next; next = next.next; } newNode.next = next; pre.next = newNode; if(val<head.val){ return newNode; }else{ return head; } } } ~~~ >2.现有两个升序链表,且链表中均无重复元素。请设计一个高效的算法,打印两个链表的公共值部分。 给定两个链表的头指针headA和headB,请返回一个vector,元素为两个链表的公共部分。请保证返回数组的升序。两个链表的元素个数均小于等于500。保证一定有公共值 测试样例: {1,2,3,4,5,6,7},{2,4,6,8,10} 返回:[2.4.6 ~~~ import java.util.*; /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Common { public int[] findCommonParts(ListNode head1, ListNode head2) { LinkedList<Integer> list = new LinkedList<Integer>(); while (head1 != null && head2 != null) { if (head1.val < head2.val) { head1 = head1.next; } else if (head1.val > head2.val) { head2 = head2.next; } else { list.add(head1.val); head1 = head1.next; head2 = head2.next; } } int[] res = new int[list.size()]; int index = 0; while (!list.isEmpty()) { res[index++] = list.pollFirst(); } return res; } } ~~~ >3.现在有一个单链表。链表中每个节点保存一个整数,再给定一个值val,把所有等于val的节点删掉。 给定一个单链表的头结点head,同时给定一个值val,请返回清除后的链表的头结点,保证链表中有不等于该值的其它值。请保证其他元素的相对顺序。 测试样例: {1,2,3,4,3,2,1},2 {1,3,4,3,1} ~~~ import java.util.*; public class ClearValue { public ListNode clear(ListNode head, int val) { // write code here if(head==null) return null; ListNode p=head.next;//先不判断头结点 ListNode pre=head; while(p!=null){ if(p.val==val){ pre.next=p.next; }else{ pre=pre.next; } p=p.next; } if(head.val==val) return head.next; else return head; } } ~~~ >4.如何判断一个单链表是否有环?有环的话返回进入环的第一个节点的值,无环的话返回-1。如果链表的长度为N,请做到时间复杂度O(N),额外空间复杂度O(1)。 给定一个单链表的头结点head(注意另一个参数adjust为加密后的数据调整参数,方便数据设置,与本题求解无关),请返回所求值。 ~~~ import java.util.*; /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class ChkLoop { public int chkLoop(ListNode head, int adjust) { //判空、有、没有 //思路:两个指针从头开始一快(2步)一慢(1步),若最后可以相聚,则链表有环 if(head==null) return -1; ListNode slow = head; ListNode fast = head; do{ if( (fast==null) || (fast.next==null)){ return -1; } fast = fast.next.next; slow = slow.next; }while(slow != fast); slow=head; while(slow!=fast){ slow=slow.next; fast=fast.next; } return slow.val; } } ~~~