链表算法总结
基础算法包括:
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 L: L0→L1→…→Ln-1→Ln, reorder it to: L0→Ln→L1→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) 编辑 收藏 举报