/** * 单链表反转 */ public static ListNode reverse(ListNode head){ ListNode pre = null; //当前节点的前一个节点 ListNode next = null;//当前节点的下一个节点 while(head != null) { next = head.next; //保存下一个节点 head.next = pre; //重置next pre = head; //保存当前节点 head = next; //重置当前节点 } return pre; }
/** * 取中间值 */ public static ListNode getMid(ListNode head) { ListNode fast = head; ListNode slow = head; while(fast.next != null && fast.next.next != null) { fast = fast.next.next; slow = slow.next; } return slow; } /** * 拆分链表 */ public static ListNode[] getLists(ListNode head) { ListNode head1 = null; ListNode head2 = null; ListNode cur1 = null; ListNode cur2 = null; int count = 0; while(head!=null) { if(count%2 == 0) { if(cur1 != null) { cur1.next = head; cur1 = cur1.next; }else { cur1 = head; head1 = cur1; } }else { if(cur2 != null) { cur2.next = head; cur2 = cur2.next; }else { cur2 = head; head2 = cur2; } } head = head.next; count++; } if (cur1 != null && cur2 != null) { cur1.next = null; cur2.next = null; } if(cur1 != null){ cur1.next = null; } if(cur2 != null) { cur2.next = null; } ListNode[] listNodes = new ListNode[]{head1, head2}; return listNodes; } /** * 归并排序链表 */ public static ListNode sortList(ListNode head){ if(head == null ||head.next == null) { return head; } ListNode mid = getMid(head); ListNode right = mid.next; mid.next = null;//咬断链表 ListNode node = mergeTwoListNode(sortList(head), sortList(right)); return node; } /** * 合并两个链表 * @param head1 * @param head2 */ public static ListNode mergeTwoListNode(ListNode head1, ListNode head2) { if(head1 == null || head2 == null) { return head1 == null? head2 : head1; } ListNode head = null; if(head1.value > head2.value) { head = head2; head.next = mergeTwoListNode(head1, head2.next); }else { head = head1; head.next = mergeTwoListNode(head1.next, head2); } return head; } public static void main(String[] args) { ListNode head = new ListNode(1); ListNode node2 = new ListNode(8); ListNode node3 = new ListNode(3); ListNode node4 = new ListNode(6); ListNode node5 = new ListNode(5); ListNode node6 = new ListNode(4); ListNode node7 = new ListNode(7); ListNode node8 = new ListNode(2); ListNode node9 = new ListNode(9); head.next = node2; node2.next = node3; node3.next = node4; node4.next = node5; node5.next = node6; node6.next = node7; node7.next = node8; node8.next = node9; Mylist.traverse(head); ListNode[] nodes = getLists(head); ListNode head1 = nodes[0]; ListNode head2 = nodes[1]; head2 = reverse(head2); head = mergeTwoListNode(head1, head2); Mylist.traverse(head); Mylist.traverse(sortList(head)); }