链表有环判断,快慢指针两种方法/合并链表/删除重复元素/二分递归和while

    public static boolean hasCycle(ListNode head) {
        if (head == null || head.next == null) {
            return false;
        }
        ListNode slow = head;
        ListNode fast = head.next;
        while (slow != fast) {
            if (slow.next == null)
                return false;
            slow = slow.next;
            if (fast.next == null)
                return false;
            if (fast.next.next == null)
                return false;
            fast = fast.next.next;
        }
        return true;
    }
    public static boolean hasCycle1(ListNode head) {
        if (head == null || head.next == null) {
            return false;
        }
        ListNode slow = head;
        ListNode fast = head.next;
        while (fast.next != null) {
            if (slow == fast) {
                return true;
            }
            slow = slow.next;
            if (fast.next.next == null){
                return false;
            }
            fast = fast.next.next;
        }
        return false;
    }
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode result = new ListNode(0);
        ListNode head1 = l1;
        ListNode head2 = l2;
        ListNode resultPoint = result;
        while (head1 != null && head2 != null) {
            if (head1.val <= head2.val) {
                ListNode currNode1 = new ListNode(head1.val);
                resultPoint.next = currNode1;
                resultPoint = resultPoint.next;
                head1 = head1.next;
            } else {
                ListNode currNode2 = new ListNode(head2.val);
                resultPoint.next = currNode2;
                resultPoint = resultPoint.next;
                head2 = head2.next;
            }
        }
        if (head1 != null) {
            resultPoint.next = head1;
        }
        if (head2 != null) {
            resultPoint.next = head2;
        }
        return result.next;
    }
}
    public static ListNode deleteDuplicates(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode pre = head;
        ListNode curr = head.next;
        while (curr != null) {
            if (curr.val == pre.val) {
                pre.next = curr.next;
            } else {
                pre = pre.next;
            }
            curr = curr.next;
        }
        return head;
    }
public static boolean binarySearchDigui(int[] array, int start, int end, int val){
        if (start >= end) {
            return false;
        }
        int mid = start + (end - start) / 2;
        if (val < array[mid]) {
            return binarySearchDigui(array, start, mid, val);
        } else if (val > array[mid]){
            return binarySearchDigui(array, mid + 1, end, val);
        } else {
            return true;
        }
    }
    public static boolean binarySearchWhile(int[] array, int start, int end, int val){
        while (start < end) {
            int mid = start + (end - start) / 2;
            if (val < array[mid]) {
                end = mid;
            } else if (val > array[mid]){
                start = mid + 1;
            } else {
                return true;
            }
        }
        return false;
    }
时间: 2024-10-14 22:15:50

链表有环判断,快慢指针两种方法/合并链表/删除重复元素/二分递归和while的相关文章

笔试,面试,C/C++,判断单链表是否带环?若带环,求环长度,求环入口点(两种方法)

SListNode* IsRing(SListNode *&pHead) //判断链表是否有环,求相聚点 {  //判空.有.没有  //思路:两个指针从头开始一快(2步)一慢(1步),若最后可以相聚,则链表有环  if (pHead)  {   SListNode *fast = pHead;   SListNode *slow = pHead;   while (fast&&fast->next)   {    fast = fast->next->next;

实现冒泡排序。(排序整形数组)。使用数组和指针两种方法。

法一:指针 #include<stdio.h> #include<stdlib.h> void bubble_sort(int arr[], int sz) { int i = 0; int j = 0; for (j = 0; j < sz - 1; j++) { for (i = 0; i < sz - 1 - j; i++) { if (*(arr + i) < *(arr + i + 1)) { int tmp = *(arr + i); *(arr + 

判断质数的两种方法

<!--方法一, 删选法,通过排除有倍数关系的数--><script type="text/javascript"> var arr = []; for(var i = 2; i < 200; i ++){ for(var j = 2 * i; j < 200; j += i){ arr[j] = true; } } for(var i = 2; i < 200; i ++){ if(arr[i] == undefined){ document

合并BIN文件的两种方法(转)

源:http://blog.chinaunix.net/uid-20745340-id-1878803.html 合并BIN文件的两种方法 在单片机的开发过程中,经常需要将两个单独的BIN文件合并成一个文件,方便烧写和生产.下面结合STM32的IAP Bootloader Code和Application Code的合并,介绍两种合并BIN文件的方法. 首先简单介绍一下STM32的IAP.IAP(In-application-programming),即在应用中编程.有了它,产品发布之后,仍然可

将单链表排序的两种方法

对单链表排序,通常有两种方法.(PS:考察一个程序员的C语言编程功底,通常看他是否能娴熟的操作链表就知道了.) 方法1:将每一个结点保存到额外的数组中,对数组进行排序,然后根据有序的数组重新构建链表. 方法2:直接对链表进行插入排序,但是实现起来比较复杂一些. 显然,方法1最为简单,因为将链式存储L先转化为顺序存储a[],对顺序存储a[]排序,就避免了较为复杂的链接指针操作.一旦对顺序存储a[]排好序后,根据a[]重新构建一个链表是易如反掌的事情. 1. 单链表的定义如下 typedef str

将单链表翻转的两种方法

将一个单链表翻转的描述很简单,例如: 输入: NODE1->NODE2->NODE3->NODE4->NODE5->NULL 输出: NODE5->NODE4->NODE3->NODE2->NODE1->NULL 那么,定义单链表如下: (为简单起见,将data字段定义为int, 当然实际应用中data很可能是一个复杂的结构体) typedef struct list_s { int data; struct list_s *next; } li

【剑指offer】递归循环两种方式反转链表

转载请注明出处:http://blog.csdn.net/ns_code/article/details/25737023 本文分别用非递归和递归两种方式实现了链表的反转,在九度OJ上AC. 题目描述: 输入一个链表,反转链表后,输出链表的所有元素.(hint : 请务必使用链表) 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000):代表将要输入的链表的个数.输入的第二行包含n个整数t(0<=t<=1000000)

反转一个链表的两种方法:递归和循环

下面是反转一个链表的两种方法: 一.循环算法 //反转一个链表,循环算法 LinkList Reverse(LinkList& head) { // if(!head) // return head; //此时不用判断head是否为空,如是空的话返回的也是空 LinkList cur = head; LinkList hou; LinkList beh = 0; while (cur) { hou = cur->next; cur->next = beh; beh = cur; cur

两种方法实现队满和队空的判断操作(循环队列)

本周的作业要求: 1.给出循环队列的存储结构定义. 2.完成循环队列的基本操作函数. 1)      初始化循环队列: 2)      建立循环队列: 3)      实现入队和出队操作: 4)     采用下面两种方法实现对满和队空的判断操作: 方法一:修改队满条件,浪费一个元素空间,队满时数组中只有一个空闲单元(必做):   方法二:设置标志flag,当front==rear且flag=0时为队空,当front==rear且flag=1时为队满(必做): 3.编写主函数实现基本操作函数功能,