链表算法总结

基础算法包括:

1. 逆转链表ListNode reverseList(ListNode head)

2. 寻找链表中间结点ListNode Findmid(ListNode head)

3. 切分链表,保留原有相对顺序使小于x的结点在大于等于x的结点左侧ListNode partition(ListNode head, int x)

4. 合并两个有序链表ListNode mergeTwoLists(ListNode l1, ListNode l2)

由基础算法构成的复杂算法有:

1. 判断链表是否为回文:利用ListNode reverseList(ListNode head), ListNode Findmid(ListNode head)

具体步骤:找到中间结点,逆转中间结点后的链表,将逆转链表的结点与原链表的依次比对。

2. Given a singly linked list LL0→L1→…→Ln-1→Ln, reorder it to: L0→LnL1→Ln-1→L2→Ln-2→…:利用ListNode reverseList(ListNode head), ListNode Findmid(ListNode head)

 具体步骤:找到中间结点,逆转中间结点后的链表,将逆转链表的结点间隔插入原链表,最后将中间结点的next置空。

3. 合并k个有序链表:利用ListNode mergeTwoLists(ListNode l1, ListNode l2)

具体步骤:将问题化整为零,利用mergeTwoLists合并两个列表。具体采用二分递归如下:

    private ListNode mergeHelper(ListNode[] lists, int start, int end){
        if (lists.length == 0) {
            return null;
        }
        if (start == end) {
            return lists[start];
        }
        int mid = start + (end - start) / 2;
        ListNode left = mergeHelper(lists, start, mid);
        ListNode right = mergeHelper(lists, mid + 1, end);
        return mergeTwoLists(left, right);
        //return mergeTwoLists(lists[start], mergeHelper(lists, start + 1, end));
    }

若不采用二分递归,而是直接递归,则会报错如下:

 Time Limit Exceeded

 

posted on 2015-11-10 17:23  ShinningWu  阅读(282)  评论(0编辑  收藏  举报

导航