1.反转链表
public class Solution { public ListNode ReverseList(ListNode head) { ListNode curr = head; ListNode pre = null; while(curr!=null){ ListNode next = curr.next; curr.next = pre; pre = curr; curr = next; } return pre; } }
思路:
首先需要定义一个pre空节点,作为反转前头节点的指向节点。
循环中,首先要保存一下当前节点的下一个节点为next,再改变curr节点的指向(反转操作)。
反转后,依次移动pre,curr。
最后一次循环后,curr已经指向空,因此跳出循环,返回pre(反转后的头节点)
2.请实现有重复数字的有序数组的二分查找。
public class Solution { public int upper_bound_ (int n, int v, int[] a) { if(v>a[n-1]) return n+1; int l=0,h=n-1; while(l<h){ int m = l+(h-l)/2; if(a[m]<v){ l = m+1; }else{ h = m; } } return l+1; } }
思路:n是数组长度,v是指定的数。
这道题主要是可能存在重复数字,要求输出在数组中第一个大于等于查找值的位置。
因此只要遍历到的数等于或者大于指定值,都要继续缩小范围继续查找。
因为遍历到的数等于指定值时,有可能它左边还有一串跟它一样的数,因此需要再次二分查找直到找到第一个比它小的数。
最后返回l+1,也就是第一个大于等于查找值的位置。
原文:https://www.cnblogs.com/augenstern/p/13758966.html